我在搜索时发现的所有解决方案都会在触发逻辑刷新过期令牌之前对来自API调用的401响应作出反应。在我的情况下,我使用 react-cognito ,它将到期时间放在cognito.user.signInUserSession.idToken.payload.exp
下的redux存储区中(整数代表unix时间)。
我想尝试实施一个暂停到期的方案,如果可行,我希望将此逻辑与我的API调用代码分开。
我探讨过的一个选项是为currentTime - expiryTime - someBuffer
设置超时,但这可能是50分钟或更长时间,而且我已经读过长时间运行的超时通常不可靠,具有奇怪的性能,尤其是在浏览器选项卡不在焦点上。
我考虑的另一个选项是循环运行的传奇,由LOGGED_IN
操作启动并以LOGGED_OUT
操作结束,检查几乎已过期的令牌并刷新它。在移动设备上,我的理解是在浏览器处于后台时暂停代码执行 - 因此这种方法会有一个边缘情况,如果用户在令牌到期后立即浏览浏览器,那么时间窗口等于API调用的循环间隔为401.循环间隔可以缩小,但边缘条件永远不能消除。
是否有一些方案可以在令牌到期之前可靠地触发事件/动作,或者在移动浏览器的情况下,如果在所需的刷新时间之后发生前景化,则在执行时立即触发恢复?
谢谢!
大卫
答案 0 :(得分:0)
不需要长时间超时,只需在令牌过期时每秒检查一次。
while(true){
yield delay(5000);
if(yield call(checkExpiring)){
yield relogin();
}
}
会有很多检查,但它们没有任何真正的性能影响。 也就是说,我通常会编写一个获取中间件来检查服务器是否回复401/402而不是重新进行身份验证并重新提交新令牌。