JWT 是不是总是需要访问令牌和刷新令牌?

Posted

技术标签:

【中文标题】JWT 是不是总是需要访问令牌和刷新令牌?【英文标题】:Does JWT require Access token and refresh token always?JWT 是否总是需要访问令牌和刷新令牌? 【发布时间】:2019-09-19 22:43:55 【问题描述】:

恕我直言,在 OAuth2.0 中签署 JWT 令牌有两种方法 - 使用对称散列算法(如 HS256)或使用非对称散列算法 (RS256)。

如果我们使用RS256等非对称哈希算法,是否需要访问令牌和刷新令牌?我相信它们不是必需的,因为无论负载中存在什么声明,资源服务器都可以独立验证(只要它知道授权服务器的公钥)。

那么访问令牌和刷新令牌的用例是什么?仅对称散列需要吗?

请帮助我更好地理解这一点。提前致谢。

【问题讨论】:

【参考方案1】:

访问令牌作为 JWT 的主要思想是您不必每次都去授权服务器。您可以通过检查签名自行验证。这可以从授权服务器/数据库中移除大量流量。 您将需要使用非对称散列算法,以便发行者拥有私钥,并且他是唯一允许发行令牌的人,您可以使用公钥检查 JWT。 刷新令牌是针对数据库验证的,可以撤销。 每次访问令牌过期时,您都使用刷新令牌从颁发者那里获取新的访问令牌。

如果您计划每次要检查访问令牌是否有效时都去授权服务器,您可以使用对称散列算法,但是您错过了 JWT 的要点 - 您仍然拥有所有授权的中心位置请求。

【讨论】:

感谢 Boaz,但我认为要验证声明,您不需要访问令牌。您可以通过获取内容的散列并验证签名中的散列是什么来验证内容。我想了解的是访问令牌的目的到底是什么。 我们以 Google 为例:在 OAuth 握手之后,您拥有访问令牌,可用于调用 Google API(从 Google Drive 获取文件)。谷歌服务器通过检查访问令牌是否有效来知道您是否被允许这样做。它不一定是 JWT,它可以是他们访问数据库并查看它是否存在并包含所需权限的密钥。如果它是 JWT,他们可以查看声明是否包含该文件的用户和权限以及签名匹配。

以上是关于JWT 是不是总是需要访问令牌和刷新令牌?的主要内容,如果未能解决你的问题,请参考以下文章

JWT, 为啥需要刷新令牌?

jwt 访问令牌和刷新令牌流

JWT 身份验证方案中的刷新令牌是不是应该使用与访问令牌不同的秘密进行签名?

为命令存储访问和刷新令牌

如何在 Django 的单个 API 中获取访问令牌和刷新令牌(rest_framework_jwt)

为啥使用 JWT 刷新令牌