firebase 每次页面可见性改变时更新idToken是否有意义?

unguejic  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(169)

我有一个React应用程序使用 www.example.com .套接字连接是基于cookie中的authtoken设置进行身份验证的,我从firebase的getIdToken方法中获得了该cookie。
通常我有这个tokenRefreshingFn,当他们使用应用程序时,它每25分钟刷新一次令牌,因为firebase id令牌(authtoken,无论如何)每小时过期一次。
但我意识到,当用户关闭笔记本电脑一段时间后,当他们返回页面时,authtoken将过期,因为令牌刷新间隔fn不会执行,而firebase authtoken仅持续1小时。所以 www.example.com 服务器将开始将他们视为注销,即使他们登录,因为令牌过期,而他们的笔记本电脑是关闭的。
为了纠正这个问题,我在应用程序的顶层添加了以下useEffect:

useEffect(() => {
  document.addEventListener('visibilitychange', () => {
      appStore.update(s => {
        clearInterval(s.tokenRefreshingFn);

        if (auth.currentUser) {
          s.tokenRefreshingFn = setInterval(async () => {
            const newAuthToken = await auth.currentUser!.getIdToken(true);
            Cookies.set('authToken', newAuthToken);
          }, ONE_MINUTE * 25);
        } else {
          s.signedIn = false;
          s.tokenRefreshingFn = null;
        }
      });
    });
  }, []);

这个有效吗?你觉得这有什么问题吗?

1zmg4dgp

1zmg4dgp1#

Firebase SDK采用这种方法来刷新令牌和离线:

  • Firebase身份验证SDK会在ID令牌过期前约5分钟刷新该令牌。
  • 当支持身份验证的Firebase SDK(例如当数据库服务器(例如,实时数据库)检测到它被重新连接到服务器,但是它的ID令牌现在到期时,它 * 首先 * 刷新ID令牌,然后才向数据库服务器(例如,实时数据库)发送任何操作。例如,待处理的写入和重新附加监听器)。

我会尝试在您自己的代码中遵循相同的方法,因此您可能需要考虑您的用例是否真的需要25分钟的时间间隔。

krcsximq

krcsximq2#

您正在使用 www.example.com ,那么使用connect_error是正确的方法。

useEffect(() => {
    socket.on("connect_error", (err) => {
      if (err.message == "not authorized") {
        // call connect function again
      }
    });

}, [])

在connect函数中,每次调用它时都应该获得新的令牌。
在大多数情况下,以下操作是不必要的,因为使用新令牌的重新连接由connect函数处理。
通常我有这个tokenRefreshingFn,当他们使用应用程序时,它每25分钟刷新一次令牌,因为firebase id令牌(authtoken,无论如何)每小时过期一次。

相关问题