当用户来到我的网站时,我使用onAuthStateChanged
来确定该用户是否已经从上一个 session 登录。
主要问题是,对于一小部分用户而言,它一直是不一致的-代码似乎没有检测到他们确实在进行有效的登录 session 。
以下代码位于应用程序本身,从首页或登录页面重定向后,用户位于该页面上。
该网站的首页还使用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);
}
});
我的用例不应该使用
onAuthStateChanged
吗?任何想法如何改善/解决这个问题?编辑:此SEEMS会在手机上的用户身上更多地发生。
最佳答案
我认为您没有按预期使用onAuthStateChanged。您不应将其视为测试用户是否登录的一种方式。调用onAuthStateChanged时,您正在注册一个函数,每次发生身份验证状态更改时都会调用该函数。
在我的应用程序(通常是React应用程序)中,通常在应用程序的主级别或最高级别中,仅一次调用onAuthStateChange。调用它来注册身份验证事件处理程序。然后,该事件处理程序功能会响应身份验证状态的更改。如果将处理函数传递给null的'user'表示没有经过身份验证的用户,它将重定向到登录页面。如果调用处理程序函数并传递了已设置的“用户”,则通常会在设置了一些具有用户详细信息的应用程序范围内的变量后,重定向到应用程序的主页或仪表板。
我处理用户尝试登录的代码调用Firebase的一种登录方法来捕获(并处理)任何响应错误。它不使用“then”功能来响应成功的登录。不需要。触发auth状态更改事件,并调用我在onAuthStateChanged注册的事件处理函数,并处理重定向等。
如果要从应用程序中多个不同位置调用onAuthStateChanged,则实际上是在注册许多不同的处理程序函数,这些函数可能全部响应身份验证状态更改。正如bojeil所评论的那样,在您的示例中,您在onAuthStateChanged上注册的函数可以调用signInAnonymously函数...,它将重新触发auth状态更改。用户永远不会真正退出,他们只会切换到匿名身份验证,这意味着他们总是会以一种或另一种方式进行身份验证。也许那就是你想要的?我不确定当多个处理程序被注册并被触发时会发生什么。
我想也值得一提的是,您在onAuthStateChanged上注册的事件处理程序函数只有在应用加载后才会被调用。您不能使用onAuthStateChanged作为同步方式来确定用户是否已通过身份验证,然后再确定如何继续加载您的应用。作为一种解决方法,我的应用程序通常在本地存储中设置一个简单的标志,指示用户已通过身份验证。应用加载后,经过刷新或其他操作后,它会在本地存储中检查该auth标志,然后继续进行相应加载。当身份验证状态更改处理程序触发时,应用程序的状态将被验证为正确,或者,如果身份验证状态不同,则应用程序将做出相应 react 。
关于javascript - onAuthStateChanged不一致,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39395158/