Dan*_* P. 10 javascript firebase firebase-authentication
当用户访问我的网站时,我会onAuthStateChanged用来确定用户是否已经从之前的会话登录.
主要问题是它与少数用户不一致 - 代码似乎没有检测到他们确实有一个有效的登录会话.
以下代码位于应用程序本身,用户在主页或登录页面重定向后位于该页面上.
该网站的主页还用于onAuthStateChanged确定是否应该直接将用户重定向到该应用程序.登录页面使用signInWithEmailAndPassword,当登录成功时,将它们重定向到应用程序页面(具有以下代码).
firebase.auth().onAuthStateChanged(function (authUser) {
if (authUser) return initApp(authUser);
// issue: sometimes users that *should* be signed-in get signed in anonymously here
firebase.auth().signInAnonymously().then(function (authUser) {
initApp(authUser);
}
});
Run Code Online (Sandbox Code Playgroud)
是onAuthStateChanged不是我应该用于我的用例?知道如何改进/解决这个问题吗?
编辑:此SEEMS更多地发生在移动设备上的用户身上.
我认为您没有按预期使用 onAuthStateChanged 。您不应该将其视为测试用户是否登录的方法。当您调用 onAuthStateChanged 时,您正在注册一个函数,每次发生身份验证状态更改时都会调用该函数。
在我的应用程序(通常是 React 应用程序)中, onAuthStateChange 通常在应用程序的主级别或最高级别中被调用一次。调用它来注册身份验证事件处理程序。然后,该事件处理函数响应身份验证状态的更改。如果处理函数传递的“user”为空,表明没有用户经过身份验证,它将重定向到登录页面。如果调用处理函数并传递设置的“用户”,则在设置一些带有用户详细信息的应用程序范围的变量后,它通常会重定向到应用程序的主页或仪表板。
我处理用户尝试登录的代码调用 Firebase 的登录方法之一来捕获(并处理)任何响应错误。它不使用“then”函数来响应成功登录。不需要。触发身份验证状态更改事件,并调用我在 onAuthStateChanged 注册的事件处理函数并处理重定向等。
如果您从应用程序中的多个不同位置调用 onAuthStateChanged,则您实际上注册了许多不同的处理程序函数,这些函数可能都响应身份验证状态更改。正如 bojeil 评论的那样,在您的示例中,您使用 onAuthStateChanged 注册的函数可以调用 signInAnonymously 函数...这将重新触发身份验证状态更改。用户永远无法真正退出,他们只会切换到匿名身份验证,这意味着他们始终会以一种或另一种方式进行身份验证。也许这就是你想要的?我不确定注册并触发多个处理程序时会发生什么。
我想还值得一提的是,您在 onAuthStateChanged 中注册的事件处理函数只有在应用程序加载后才会被调用。您不能使用 onAuthStateChanged 作为同步方式来确定用户是否已通过身份验证,然后确定如何继续加载您的应用程序。作为一种解决方法,我的应用程序通常在本地存储中设置一个简单的标志,指示用户已通过身份验证。当应用程序加载时,在刷新或其他操作后,它会检查本地存储中的该身份验证标志,然后继续相应地加载。当身份验证状态更改处理程序触发时,应用程序的状态将被验证为正确,或者如果身份验证状态不同,则应用程序会做出相应的反应。
| 归档时间: |
|
| 查看次数: |
3937 次 |
| 最近记录: |