onAuthStateChanged 不一致

Posted

技术标签:

【中文标题】onAuthStateChanged 不一致【英文标题】:onAuthStateChanged inconsistent 【发布时间】:2017-01-16 15:15:14 【问题描述】:

当用户访问我的站点时,我使用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);
  
);

onAuthStateChanged 不应该用于我的用例吗?知道如何改进/解决这个问题吗?

编辑:这似乎更多地发生在手机用户身上。

【问题讨论】:

确保在登录页面重定向之前等待 signInWithEmailAndPassword 解决。可能是您过早地重定向到应用程序页面。此外,您上面的代码在匿名登录时调用 initApp 两次,因为 onAuthStateChanged 观察者将在匿名登录后再次触发。 谢谢。正确 - 代码再次运行,但我在 initApp 函数中有一个 userInitiated 变量来正确处理已经登录的用户。我有时需要调用 initApp 函数来恢复以前的在线状态,即使用户由于 wifi 连接丢失或随机 Firebase 重新连接而因重新连接而离线。 是的,我一直在确保在重定向之前已解决 signInWithEmailAndPassword。 我得到了同样的结果。我在身份验证下删除了 Firebase 控制台上的用户,但该用户保持登录状态。 【参考方案1】:

我认为您没有按预期使用 onAuthStateChanged。您不应该将其视为测试用户是否登录的一种方式。当您调用 onAuthStateChanged 时,您正在注册一个每次身份验证状态发生更改时都会调用的函数。

在我的应用程序(通常是 React 应用程序)中,onAuthStateChange 通常只在应用程序的主级别或***别调用一次。调用它来注册身份验证事件处理程序。然后,该事件处理函数响应身份验证状态的变化。如果处理函数传递了 null 的“用户”,表示没有用户通过身份验证,它会重定向到登录页面。如果调用处理函数并传递一个 IS 设置的“用户”,它通常会在设置一些应用范围内的用户详细信息后重定向到应用的主页或仪表板。

我处理用户登录尝试的代码调用 Firebase 的一种登录方法来捕获(并处理)任何响应错误。它不使用“then”函数来响应成功的登录。它不需要。触发身份验证状态更改事件,并调用我在 onAuthStateChanged 注册的事件处理函数并处理重定向等。

如果您从应用内的多个不同位置调用 onAuthStateChanged,您实际上是在注册许多不同的处理函数,这些函数可能都响应身份验证状态更改。正如 bojeil 评论的那样,在您的示例中,您使用 onAuthStateChanged 注册的函数可以调用 signInAnonymously 函数......这将重新触发身份验证状态更改。用户永远无法真正退出,他们只是切换到匿名身份验证,这意味着他们总是以一种或另一种方式进行身份验证。也许这就是你想要的?我不确定当多个处理程序被注册并被触发时会发生什么。

我想还值得一提的是,您使用 onAuthStateChanged 注册的事件处理函数在您的应用加载之前不会被调用。您不能使用 onAuthStateChanged 作为同步方式来确定用户是否已通过身份验证,然后确定如何继续加载您的应用程序。作为一种解决方法,我的应用程序通常在本地存储中设置一个简单的标志,指示用户已通过身份验证。当应用程序加载时,在刷新或其他操作后,它会在本地存储中检查该身份验证标志,然后继续相应地加载。当身份验证状态更改处理程序触发时,应用的状态要么被验证为正确,要么,如果身份验证状态不同,应用会做出相应的反应。

【讨论】:

只是对您的看法感到好奇,因为我目前使用类似的策略。登录后如何处理将用户重定向到不是主页的特定页面?假设他们直接转到 /account 而不是 /dashboard - 在您描述的场景中,他们将始终被带到您的主要“登录”路线 - 对吗? 您可以使用 onAuthStateChanged 处理程序重定向到您希望的任何路线。虽然这是一种合理的方法,但更具体地说,我根据用户是否经过身份验证提供了两组可用的路由。每组路由都有一个“默认”。用户可能在/signin 路由上,当他们的身份验证状态更改导致该路由不再可用并且他们被重定向到默认的/dashboard(或任何你想要的)路由。我的 onAuthStateChanged 处理程序只是设置用户的身份验证状态。我的应用重定向基于动态可用的路由。

以上是关于onAuthStateChanged 不一致的主要内容,如果未能解决你的问题,请参考以下文章

Firebase onauthstatechanged 在页面加载时触发不一致

firebase.auth().onAuthStateChanged 不工作

c#访问性不一致的问题

Android依赖库版本不一致的解决办法

HBase 一致性检查与修复

如果收到的发票与入库数量不一致怎么办?