如何基于使用 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 访问令牌和刷新令牌?的主要内容,如果未能解决你的问题,请参考以下文章

OIDC-基于OAuth2的下一代身份认证授权协议

PHP下的Oauth2.0尝试 - OpenID Connect

在基于 OAuth2 的身份验证中,状态参数可以防止啥样的 CSRF 攻击?

在 Spring Boot 2 上实现基于过滤器的 JWT 身份验证与 OAuth2 JWT 身份验证

SAML和OAuth2这两种SSO协议的区别

如何使用 OAuth2 身份验证保护私有数据?