我想检查客户端的令牌是否过期。
我的令牌存储在本地存储中。
现在我要做的是:我调用服务器来检查它是否有效,但我只在路径为:第一个月
代码:
useEffect(() => {
verifyToken(auth.token).then((res) => {
if (res.status !== 'success' && res.message === 'Token expired') {
signoutClient(() => {
router.push('/auth/login');
});
}
});
}, [auth.token, router]);
现在的问题是,如果用户直接转到另一个url exp:https:exp.com/helloworld
我想用插座,但我不知道它是否可以工作。
想法是:客户端保持侦听状态,每当令牌过期时,服务器发出一条消息。
你知道我该怎么做吗?
3条答案
按热度按时间rnmwe5a21#
有不同的技术。
被动呼气
我最喜欢的模式是有一个专门的服务器错误。
当令牌过期时,服务器应响应一个特定的错误(由于角色访问而与
401 Unauthorized
不同)。然后,向客户机添加一个HTTP中间件,该中间件:/auth/login
或者,如果您有
renew token
:JWT
JWT
视为一个模糊的字符串,并且不存在与时间相关的问题。*返回单独的字段
如果出于安全原因,您希望在会话过期时隐藏敏感信息,即使用户没有与UI交互(如银行网站),您需要知道令牌何时过期。一种常见的技术是将过期时间与令牌一起返回(在身份验证响应中)。
或者更好
expiresAt
和expiresIn
中移除一小段时间步长,以避免时钟抖动和时钟漂移问题。*解析JWT
如果您没有其他解决方案,您可以随时解析
JWT
:tktrz96b2#
您可以使用一个库(如jwt_decode)来解码您的JWT令牌,其中它很可能包含一个您可以检查的过期时间戳(将其与当前时间戳进行比较),如果过期,只需将其从本地存储中删除,并将用户重定向到登录页面。
但您还必须考虑为调用API以检查任何
401
响应状态代码的函数添加一个catch
块,以便执行相同的操作(如果令牌有效,则当用户在其到期日期附近移动时)gpnt7bae3#
如果您使用的是Axios库,则可以使用拦截器来检查令牌过期,这样就可以放入一个请求,处理从后端API检索新的JWT令牌。