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"