【发布时间】:2018-11-13 23:34:13
【问题描述】:
前提条件
$npm install --save firebase@4.11.0
问题
我在我的 Web 应用程序上使用 firebase 身份验证。
在我的应用程序中,我为客户端 js 实现了onAuthStateChanged,如下所示。
firebase.auth().onAuthStateChanged((user) => {
if(user) {
//logged in
} else {
//do sth
}
});
登录后,我确认此方法将返回实际用户obj,但如果我刷新页面,则用户可能为空。 奇怪的是,有时用户不会为空。 恐怕调用onAuthStateChanged会有一些限制,但目前我不知道。
我应该如何处理这个问题?
更新
让我分享我的最小示例。
我的应用正在使用 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';
}
}
我认为登录状态存储在 Web 浏览器的 LocalStorage 中。
这意味着,在完成 main.js 的加载后,onAuthStateChanged 将使用用户信息自动触发,但不会像我预期的那样工作。
我确信登录信息的持久性是正确的,因为官方文档说默认设置是 LOCAL 用于 web 客户端。
https://firebase.google.com/docs/auth/web/auth-state-persistence
我的问题
我应该用另一种方式实现 onAuthStateChanged 吗? 重新加载后如何确保用户已登录?
例如
import $ from 'jquery';
$(document).on('ready', () => {
onAuthStateChanged((user) => {...});
});
或者你能告诉我正确的方法吗?
解决方法
如果返回 null,我决定删除会话并设置重定向到登录页面。这不是解决方案,而是当前的解决方法...
【问题讨论】:
-
.onAuthStateChanged是异步的,在页面加载/刷新时为微秒解析 null。这就是它的工作原理。您可以将 loader 的 gif 变灰或放置。 -
你的意思是说,在重新加载后,第一个
onAuthStateChanged事件将被空用户触发,几秒钟后该事件将被实际用户信息重新触发?我实现了加载 gif 10 秒,直到加载完成,就像你提到的那样,但是,不幸的是,我的onAuthStateChanged只被空用户触发一次...... -
在另一个浏览器上尝试网络应用/您的应用。我注意到,例如,如果您将 Firefox 设置为从不记住历史记录(可能是关闭存储),我的身份验证将失败且没有任何有意义的错误。
-
您是否在使用主机重写?延迟对我来说非常重要,但如果我不使用托管重写,它就会完全消失。
标签: javascript firebase firebase-authentication