如何基于使用 Oauth2 协议的身份验证改进 JWT 访问令牌和刷新令牌?
Posted
技术标签:
【中文标题】如何基于使用 Oauth2 协议的身份验证改进 JWT 访问令牌和刷新令牌?【英文标题】:How to improve a JWT access token and refresh token based on authentication with Oauth2 protocol? 【发布时间】:2021-12-06 19:52:55 【问题描述】:我已经使用访问令牌、刷新令牌和刷新令牌轮换构建了一种身份验证。当用户登录时,系统会生成一个 JWT 令牌和一个 UUID 散列刷新令牌,然后将其刷新令牌 id 返回给用户。
初始化刷新令牌是一个 UUID 令牌,它使用bcrypt
对 uuid 令牌进行哈希处理,然后保存在数据库中。在数据库上,除了保存刷新令牌id和哈希令牌外,我还保存了它的过期日期、它的userId、活动状态和撤销的ip。
访问令牌在 Authentication
标头中作为 Bearer
令牌传递给 JWT 验证。当一个访问令牌过期时,它会使用旧的刷新令牌值及其 id 调用/refresh-token
以获取新的访问令牌和刷新令牌对。如果刷新令牌过期,我会要求用户重新登录。
我还有一个刷新令牌轮换方法来避免刷新令牌重用。当重新使用刷新令牌时,我将撤销并禁用属于该 userId 系列的所有刷新令牌。所以用户应该再次登录以获得新的访问令牌和刷新令牌对。
我知道OAuth2
是一个很好的协议来实现访问令牌和刷新令牌认证。使用我的身份验证设计,如何改进它以使用OAuth2
?
【问题讨论】:
【参考方案1】:听起来您的 UUID 对客户端具有刷新令牌的所有功能。如果客户端是浏览器,它永远不会收到刷新令牌 - 安全 cookie 被认为更好。
我建议的主要内容是使用授权服务器并遵循有关 API、Web 和移动应用程序的标准指南。
OAuth 提供了许多安全设计模式。值得了解 Web 和移动客户端的细节。还要考虑与安全相关的功能,例如对已发行令牌的审计。
以下是我工作的 Curity 提供的一些资源。这里的概念适用于任何提供者 - 重要的是原则:
IAM Primer Free Authorization Server Guides【讨论】:
嗨,为什么 cookie 比刷新令牌上的响应正文更安全? 如果客户端可以安全地存储它们但浏览器不能,则可以在响应正文中刷新令牌。 2021 年浏览器存在 XSS 问题,首选最新的SameSite=strict
cookie。见this video。正如您所看到的,根据客户的类型,通常存在不同的问题。以上是关于如何基于使用 Oauth2 协议的身份验证改进 JWT 访问令牌和刷新令牌?的主要内容,如果未能解决你的问题,请参考以下文章
PHP下的Oauth2.0尝试 - OpenID Connect
在基于 OAuth2 的身份验证中,状态参数可以防止啥样的 CSRF 攻击?