【问题标题】:Why is Firebase onDisconnect firing every hour?为什么 Firebase onDisconnect 每小时触发一次?
【发布时间】:2016-10-29 03:10:47
【问题描述】:

我有一个使用 javascript Web SDK 的 Firebase 应用。我们的客户正在使用自定义身份验证方法。我们已经使用 onDisconnect 实现了一个在线状态系统。我们看到 onDisconnect 每小时触发一次,在大多数情况下,客户端实际上并没有断开连接。这对我们来说是个问题,因为我们正在为我们的客户端跟踪和呈现连接/断开连接事件,这使得客户端看起来好像在断开连接而不是断开连接。

我的猜测是,每小时都会发生某种身份验证令牌刷新,这会导致 onDisconnect 触发。但是,我不知道如何深入挖掘以确认或找到不同的根本原因。谁能帮我解决这个问题?

有人建议这是 this question 的副本,但这是关于基本的 onDisconnect 操作,这是关于 onDisconnect 每小时触发一次的可重复观察,尽管客户端没有断开连接。

【问题讨论】:

  • 我不这么认为。这个问题是关于 onDisconnect 的基本行为的。这个问题是关于我观察到 onDisconnect 每小时为连接的客户端触发一次。
  • 总是1小时吗?为所有客户固定?无论他们的地区、国家是什么?
  • 始终是 1 小时,正负几分钟。我们只有在东海岸部署的客户端,所以我无法回答地区,但客户端肯定在不同的网络上。
  • 如果连接每小时抖动一次,这可能与正在刷新访问令牌有关。

标签: javascript firebase firebase-realtime-database firebase-authentication


【解决方案1】:

我不知道这个onDisconnect 函数是如何实现的。解释您如何确定断开连接会很有帮助。 Firebase Id 令牌每小时过期一次,需要刷新(调用任何用户方法后自动刷新)。如果您使用的是实时数据库,他们将尝试在到期时刷新。您可以在颁发令牌时在onAuthStateChanged 中添加监听器,并设置计时器以在令牌(getToken(true))过期之前自动刷新,确保不会触发断开连接。

此外,onDisconnect 将在断开连接期间失败,因为 Firebase 认为令牌已过期。

【讨论】:

    【解决方案2】:

    由于您使用的是 Firebase Web SDK,您可以通过调用获取当前令牌并检查其过期时间戳:

    firebase.auth().currentUser.getToken(false); // pass false to retrieve cached token

    您可以设置间隔以定期检查令牌过期时间,并尝试在令牌过期前(例如过期前 60 秒)手动刷新令牌,方法是调用:

    firebase.auth().currentUser.getToken(true); // pass true to force token refresh

    这应该可以防止 onDisconnect 事件(.info/connected listener)由于令牌过期而触发。

    【讨论】:

      【解决方案3】:

      我相信 onDisconnect 每小时触发一次是 Firebase JS SDK 中的一个错误。通常,如果存在数据库连接等消费者,Firebase Auth 会在令牌到期之前主动刷新令牌。如果刷新没有自动发生,连接会在到期时关闭,随后的重新连接将请求一个新的令牌,从而导致它被刷新。

      我已经确认手动启动主动刷新逻辑可以避免每小时断开连接。

      我已针对 SDK 提交了一个错误:https://github.com/firebase/firebase-js-sdk/issues/5498

      【讨论】:

        猜你喜欢
        • 2016-11-04
        • 1970-01-01
        • 1970-01-01
        • 2017-02-25
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 2018-09-05
        • 1970-01-01
        相关资源
        最近更新 更多