我有一个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;
}
});
});
}, []);
这个有效吗?你觉得这有什么问题吗?
2条答案
按热度按时间1zmg4dgp1#
Firebase SDK采用这种方法来刷新令牌和离线:
我会尝试在您自己的代码中遵循相同的方法,因此您可能需要考虑您的用例是否真的需要25分钟的时间间隔。
krcsximq2#
您正在使用 www.example.com ,那么使用connect_error是正确的方法。
在connect函数中,每次调用它时都应该获得新的令牌。
在大多数情况下,以下操作是不必要的,因为使用新令牌的重新连接由connect函数处理。
通常我有这个tokenRefreshingFn,当他们使用应用程序时,它每25分钟刷新一次令牌,因为firebase id令牌(authtoken,无论如何)每小时过期一次。