1

Logic: пользователи выбрать несколько элементов на странице , затем нажмите кнопку «Подтвердить», которая начинает Firebase поток $signInAnonymously() аутентификации. Их выбор хранится под их веткой users/{uid} в дереве базы данных, и они перенаправляются на страницу проверки , которая извлекает их выбор и запрашивает дополнительную информацию.Невозможно получить данные анонимного пользователя, прошедшего проверку подлинности на первом входе

Вопрос: когда пользователь приземляется на странице проверки, когда их состояние аутентификации не может быть восстановлено (поэтому их выбор не появляется). Однако при обновлении страницы, все работает, как ожидается, для всех последующих попыток (их данные пользователя хранятся и теперь извлекаемый)

Код:

  • аутентификации пользователя и выбор сеттер/добытчика завод userService

    var auth = $firebaseAuth(); 
    var usersRef = $firebaseRef.users; // custom ref in app config 
    
    // Authenticate anonymously to create user session 
    function startSession() { 
        return auth.$signInAnonymously() 
        .then(function(user) { 
         return user; 
        }) 
        .catch(function(error) { 
         console.log(error); 
        }); 
    } 
    
    // Check authentication state before everything loads 
    function checkAuthState() { 
        return $q(function(resolve) { 
        var unsubscribe = auth.$onAuthStateChanged(function(user) { 
         if (user) { 
         unsubscribe(); 
         resolve(user); 
         } 
         else { 
         console.log('User unidentified'); 
         } 
        }); 
        }); 
    } 
    
    // Save user's menu selection into selection node of firebase 
    function saveSelection(items, user) { 
        var selectionRef = usersRef.child(user.uid).child('selection'); 
        for (var i = 0, item; !!(item = items[i]); i++) { 
        var id = item.id; 
        if (item.selected) { 
         selectionRef.child(id).update(item); 
        } 
        else if (typeof(selectionRef.child(id)) !== 'undefined') { 
         selectionRef.child(id).remove(); 
        } 
        } 
    } 
    
    // Get user's selection from firebase 
    function getSelection(user) { 
        var selectionRef = usersRef.child(user.uid).child('selection'); 
        return $q(function(resolve) { 
        var selection = $firebaseArray(selectionRef); 
        resolve(selection); 
        }); 
    } 
    
  • контроллер меню:

    var menu = this; 
        menu.saveMenu = saveMenu; 
    
        // Save menu selection and create anonymous user on firebase 
        function saveMenu() { 
        var items = menu.items; 
        return userService.startSession() 
         .then(function(user) { 
         return userService.saveSelection(items, user); 
         }); 
        } 
    
  • контроллер Checkout:

    // Get selected menu items from user data 
    function getCheckoutItems() { 
        return userService.checkAuthState() 
        .then(function(user) { 
        return userService.getSelection(user); 
        }) 
        .then(function(selection) { 
        checkout.items = selection; 
        return checkout.items; 
        }) 
        .catch(function(error) { 
        console.log(error); 
        }); 
    } 
    

Я просмотрел десятки постов на SO, прежде чем спрашивать это. Вот несколько из подобных я нашел: Apparent race condition getting firebase.User from controller in Firebase 3.x Handle asynchronous authentication in Firebase on page reload to get list that needs user's uid

Я также посмотрел через ссылку на GitHub, чтобы установить его: https://github.com/firebase/angularfire/blob/master/docs/reference.md#firebaseauth

NB: Я использую новый версия Firebase с угловыми 1.5.8:

"firebase": "^3.4.1", 
"angularfire": "^2.0.2" 

ответ

1

UPDATE

Понял. Мне пришлось добавить resolve к моему маршруту /checkout, чтобы дождаться аутентификации, прежде чем загружать элементы на странице ... Понял это благодаря this answer от David East от команды Firebase.

resolve: { 
     // controller will not be loaded until $waitForSignIn resolves 
     "firebaseUser": function($firebaseAuthService) { 
     return $firebaseAuthService.$waitForSignIn(); 
     } 
    } 
Смежные вопросы

 Смежные вопросы