【问题标题】:Test if there is a pending firebase authentication测试是否有待处理的 firebase 身份验证
【发布时间】:2018-09-04 15:22:42
【问题描述】:

更新:由于代码重构,测试需求已经消失,正如 Ron 在接受的答案中指出的那样,onAuthStateChange() 最终会触发,应用程序可以依赖它.我最初并没有看到这一点,这正是我提出问题的原因。

原始问题:我一直在使用window.localStorage 并搜索以'firebase:authUser' 开头的密钥,以此来确定我的应用程序是否可以在不久的将来发生firebase 身份验证事件。不管成功还是失败,都会触发firebase.auth().onAuthStateChanged(),我可以在那里处理结果。想知道的原因是,如果我一些正在处理的本地凭据,我的应用程序可以显示“请稍候...”类型的消息。但如果没有,它可以立即重定向到登录页面。由于 firebase 移至 indexedDB,此代码不再有效,而且我找不到任何等效的 hack 来查找本地持久的凭据(也许现在不可能?)。

我也很乐意切换到SESSIONpersistence,而不是LOCAL,但我不确定这是否会改变场景——我仍然需要一种方法来测试是否有任何事情发生如果没有要验证的本地凭据,以避免用户永远停留在“请稍候...”消息。

还是我做错了?我知道我可以显示登录页面 直到 firebase.auth().onAuthStateChanged() 触发,但是到那时用户可能已经点击了,如果他们已经登录然后刷新页面,体验也不是那么好,他们在哪里看到登录页面再次,直到所有内容都加载完毕。

我在auth() API 中找不到任何东西来判断它是否正在处理本地持久化的凭据,到目前为止,window.localStorage hack 一直运行良好。现在管理用户体验的最佳方式是什么?

【问题讨论】:

  • 也在 Github 上发布:github.com/firebase/firebase-js-sdk/issues/595。交叉发布时请注明,以便其他人同时查看这两个链接。
  • 为什么要关闭它呢?我很高兴发帖,但有些人可能更喜欢一个频道而不是另一个频道,如果在任何一个地方都能找到解决方案,我会随时更新。不过,请参阅下面的评论。这仍然不是有效的 FR 吗?
  • 我并没有说它应该关闭,只是表明当你交叉发布时表明它被认为是适当的礼仪,以减少完成双重工作的机会。但鉴于我们的一位工程师在这里回答,他们关闭 Github 问题以确保讨论停留在一个地方是有道理的。

标签: firebase firebase-authentication


【解决方案1】:

您可以灰显输入并禁用提交按钮,直到 .onAuthStateChanged 解决问题,这会很快发生,通常在 1 秒内。也许在登录表单上放一个linear progress indicator

【讨论】:

  • 问题是如果没有保存的凭据,您不会收到事件,因此控件将保持禁用状态。除非您使用其他地方建议的超时,否则这似乎不是一个好的设计。
  • 假设您使用的是 firebase 身份验证,.onAuthStateChanged 是您应用状态的核心。如果没有解决,则说明您不在线。我想,离线支持本身就是一个特定的问题......
  • 这与离线访问无关。关键是如果有保存的凭据,onAuthStateChanged() 将(最终)触发。如果没有凭据,则不会。目前(据我所知)应用程序无法区分这两种情况。在您的解决方案中,如果没有保存的凭据,什么会重新启用禁用的按钮?
  • 如果实现了.auth,它将始终触发。如果没有凭据,它将返回null。试试吧。 firebase.auth().onAuthStateChanged(function(user) { console.log(user);
  • 好吧。我一直在使用它,但我没有看到那个空事件。我只在处理登录或显式注销时看到onAuthStateChanged 触发,而不是在应用程序初始化时。但是一个香草项目确实显示了这一点,所以感谢您的指点。我重构了我所有的 firebase.auth 代码(它位于 Vue / Vuex / Vue Router 应用程序的几个模块中),现在它的行为如你所说 - 一定是旧代码中的初始化错误。不过,我现在不确定是否将其标记为正确答案,因为这个问题没有实际意义。你怎么看?
【解决方案2】:

依赖底层实现绝不是一个好主意,而不是提供公共 API。 Firebase 有权随时更改此设置。他们甚至可以使用不同的格式来持久化用户,这会破坏您的实现。

也就是说,您可以通过在用户登录时在localStorage 中设置您自己的标志并在用户退出时将其删除来轻松绕过此问题。这比依靠您拥有的黑客要好。在这种情况下,您可以完全控制该标志。您可以在触发onAuthStateChanged 后的任何时候用户登录并在退出时将其删除。加载页面时,您可以直接读取该值以了解是否显示进度条。

【讨论】:

  • 我同意这并不理想,因此弗兰克已经关闭了我的 FR :(。我最初的解决方案来自这里:stackoverflow.com/questions/39035594/… 我的应用程序很可能会看到火力库可能是或可能不是什么做很容易变得不同步,所以问题并没有真正解决。但至少比现在稍微好。我仍然认为如果API能提供状态会很好,但弗兰克似乎不同意...
  • 我从未评论过此功能请求的有效性,也没有关闭您在 Github 上打开的问题。但如果您认为这是一个很好的添加功能,filing a feature request with the Firebase support team 是最好的渠道。
  • 对不起,弗兰克——电子邮件通知看起来像是你发表了评论然后关闭了它,我没有去 github 检查。我很着急,这也是为什么没有交叉引用的原因。非常抱歉。我将通过该链接提交更完整的功能请求——尽管 github 问题模板确实建议在那里发布功能请求......
  • @bojeil 我已经向 Frank 建议的链接提交了更完整的 FR 文章,并将文本复制到 github 问题中。 github模板建议这是FRs的地方,所以我不确定哪个更好......
猜你喜欢
  • 1970-01-01
  • 2021-07-11
  • 2017-01-17
  • 1970-01-01
  • 2020-03-06
  • 2016-06-12
  • 2017-05-07
  • 2017-01-13
  • 1970-01-01
相关资源
最近更新 更多