我使用访问 token 、刷新 token 和刷新 token 轮换构建了一种身份验证。当用户登录时,系统会生成一个 JWT token 和一个 UUID 哈希刷新 token 及其刷新 token ID,然后返回给用户。
初始化刷新 token 是一个 UUID token ,它使用 bcrypt
对 uuid token 进行哈希处理,然后保存在数据库中。在数据库中,除了保存刷新 token id和哈希 token 之外,我还保存了它的过期日期、它的userId、事件状态和撤销的ip。
访问 token 在 Authentication
header 中传递,作为 JWT 验证的 Bearer
token 。当一个访问 token 过期时,它会使用旧的刷新 token 值及其 ID 调用 /refresh-token
来获取新的访问 token 和刷新 token 对。如果刷新 token 过期,我会要求用户重新登录。
我还有一个刷新 token 轮换方法,以避免刷新 token 重复使用。当重复使用刷新 token 时,我将撤销并禁用属于该 userId 系列的所有刷新 token 。因此用户应该再次登录以获取新的访问 token 和刷新 token 对。
我知道OAuth2
是一个很好的协议(protocol)来实现访问 token 和刷新 token 身份验证。对于我的身份验证设计,如何改进它以使其与 OAuth2
兼容?
最佳答案
听起来您的 UUID 具有客户端刷新 token 的所有功能。如果客户端是浏览器,则它永远不会收到刷新 token - 安全 cookie 被认为更好。
我建议的主要做法是使用授权服务器并遵循有关 API、网络和移动应用程序的标准指南。
OAuth 提供了许多安全设计模式。了解网络和移动客户端的具体情况是值得的。还要考虑与安全相关的功能,例如审核发行的代币。
以下是我工作的 Curity 提供的一些资源。这里的概念适用于任何提供商 - 重要的是原则:
关于authentication - 如何改进基于 Oauth2 协议(protocol)身份验证的 JWT 访问 token 和刷新 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69638425/