2 回答

TA贡献1827条经验 获得超9个赞
当您创建令牌和刷新令牌时,两者都应具有一个到期日期,例如:
return new Token()
{
ClientId = clientId,
EmployeeId = userId,
Value = GenerateRefreshToken(),
CreatedDate = DateTime.UtcNow,
ExpirationDate = <you decide>
};
在每个请求上,您都应该通过比较日期来检查令牌是否过期。如果已过期,则可以使用保持用户身份验证。最终,您甚至无法使刷新令牌过期,因为它必须由您的应用程序安全地存储。
刷新令牌和短期令牌背后的想法是,如果令牌被泄露,黑客只需要说10分钟,他就需要refresh_token来生成一个新令牌。

TA贡献1813条经验 获得超2个赞
最佳实践要求刷新令牌只能使用一次,并且每次使用新令牌时都应该发行一个。再次尝试使用旧的令牌应视为被盗令牌-该用户的所有未使用令牌均应失效,并且任何新的访问尝试均需要完整登录。
当两个会话共享一个公共的刷新令牌时(例如,当在浏览器中打开两个选项卡并且该令牌存储在仅HTTP的cookie中时),就会发生竞争状态。当出现两个会话使用相同的刷新令牌同时尝试刷新的情况时,服务器的第一个会话将获得有效的新令牌,但是第二个会话发现其令牌现在无效并被注销。
如OP所述,可以使用诸如忙碌标志之类的机制在前端解决此问题,以便必须先完成第一次刷新,然后才能进行第二次刷新。
在后端,您可以使用一种机制,允许刷新令牌在完全失效或删除之前的很短时间内(仅几秒钟)被重用。
添加回答
举报