Иногда firebase.auth (). OnAuthStateChanged возвращает пользователя с нулевым значением, когда я обновляю страницу - PullRequest
0 голосов
/ 04 июня 2018

Условие

$ npm install --save firebase@4.11.0

Issue

Я использую проверку подлинности firebase в своем веб-приложении.В моем приложении я реализовал onAuthStateChanged для js на стороне клиента, как показано ниже.

firebase.auth().onAuthStateChanged((user) => {
  if(user) {
    //logged in
  } else {
    //do sth
  }
});

После входа в систему я подтвердил, что этот метод вернет фактическое значение пользователя obj, но если я обновлю страницу, то пользователь может быть пустым,Любопытно, что иногда пользователь не будет нулевым.Боюсь, что есть некоторые ограничения для вызова onAuthStateChanged, но в настоящее время я понятия не имею.

Как мне решить эту проблему?

update

Позвольте мне поделиться своимминимальный пример.

Мое приложение работает с express.js.Есть два URL, как показано ниже./login /main

На странице входа в систему я реализовал метод аутентификации.Если вход успешно завершен, пользователь будет перенаправлен на «/main».

//login.js
import firebase from 'firebase';
var config = {...};
firebase.initializeApp(config);

var provider = new firebase.auth.GoogleAuthProvider();
firebase.auth().signInWithPopup(provider)
.then((result) => {
  return result.user.getIdToken(true);
}).then((idToken) => {
  if(idToken) {
    location.href = '/main';
  }
});

На главной странице нет способа входа.main.js только проверяет, вошел ли пользователь в систему.

//main.js
import firebase from 'firebase';
var config = {...};
firebase.initializeApp(config);

firebase.auth().onAuthStateChanged((user) => {
  if (user) {
    //initialize main page.
  } else {
    location.href = '/login';
  }
}

Я думаю, что статус входа хранится в LocalStorage веб-браузера.Это означает, что после завершения загрузки main.js onAuthStateChanged будет автоматически запущен с информацией о пользователе, но не будет работать, как я ожидал.Я уверен, что сохраняем регистрационные данные правильно, потому что в официальном документе сказано, что по умолчанию для веб-клиента установлено значение LOCAL.

https://firebase.google.com/docs/auth/web/auth-state-persistence

мой вопрос

СледуетЯ реализую на AuthStateChanged другим способом?Как я могу убедиться, что пользователь вошел в систему после перезагрузки?

например

import $ from 'jquery';
$(document).on('ready', () => {
  onAuthStateChanged((user) => {...});
});

Или вы могли бы показать мне правильный путь?

Временное решение

Iрешил удалить сеанс и установить перенаправление на страницу входа, если возвращается ноль.Это не решение, а обходной путь в настоящее время ...

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Вы не звоните onAuthStateChanged.Вместо этого вы говорите Firebase вызвать you при изменении состояния аутентификации, что может произойти несколько раз, когда страница перезагружается

Когда страница загружается и быларанее пользователь вошел в систему, состояние аутентификации может изменяться несколько раз, в то время как клиент выясняет, остается ли оно в состоянии аутентификации пользователя действительным.По этой причине вы можете увидеть вызов без пользователя, прежде чем увидите окончательный вызов с фактическим вошедшим пользователем.

0 голосов
/ 06 июня 2018

onAuthStateChanged - это наблюдатель, как указано в документах Firebase, который запускается при изменении состояния авторизации, например, при входе пользователя в систему, выходе из нее и изменении pwd.Чтобы проверить, вошел ли пользователь в систему или нет, вы должны использовать firebase.auth (). CurrentUser, который выдаст вам текущего вошедшего в систему пользователя.Как вы сказали, ваше состояние - local firebase.auth (). CurrentUser всегда выдаст вам пользователя, если пользователь не вышел из системы.

0 голосов
/ 04 июня 2018

Тот факт, что иногда он нулевой, а иногда и ненулевой, указывает на проблему асинхронности.Вы делаете проверку в заявлении if выше?Все ссылки на пользователя должны быть в пределах обратного вызова.Если это все подтвердится, возможно, проверьте, что аутентификация правильно инициируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...