ChatGPT解决这个技术问题 Extra ChatGPT

JWT 刷新令牌流

我正在构建一个移动应用程序并使用 JWT 进行身份验证。

似乎最好的方法是将 JWT 访问令牌与刷新令牌配对,以便我可以根据需要频繁地使访问令牌过期。

刷新令牌是什么样的?它是一个随机字符串吗?该字符串是否已加密?它是另一个 JWT 吗?刷新令牌将存储在用户模型上的数据库中以供访问,对吗?在这种情况下似乎应该对其进行加密我是否会在用户登录后将刷新令牌发回,然后让客户端访问单独的路由以检索访问令牌?

请注意,如果您使用刷新令牌,您应该为用户提供在 UI 上使它们无效的能力。如果它们不使用例如一个月,也建议自动过期。

a
amucunguzi

以下是撤销 JWT 访问令牌的步骤:

当您登录时,发送 2 个令牌(访问令牌、刷新令牌)以响应客户端。访问令牌的到期时间较短,而刷新的到期时间较长。客户端(前端)会将刷新令牌存储在其本地存储中,并将访问令牌存储在 cookie 中。客户端将使用访问令牌来调用 API。但是当它过期时,您调用身份验证服务器 API 来获取新令牌(刷新令牌会自动添加到 http 请求,因为它存储在 cookie 中)。您的身份验证服务器将公开一个 API,该 API 将接受刷新令牌并检查其有效性并返回新的访问令牌。刷新令牌过期后,用户将被注销。

如果您需要更多详细信息,请告诉我,我也可以分享代码(Java + Spring boot)。

对于您的问题:

Q1:这是另一个 JWT,索赔较少,到期时间长。

Q2:它不会在数据库中。后端不会存储在任何地方。他们只会用私钥/公钥解密令牌,并用它的到期时间来验证它。

Q3:是的,正确的


我认为 JWT 应该存储在 localStorage 中,而 refreshToken 应该存储在 httpOnly 中。 refreshToekn 可用于获取新的 JWT,因此必须格外小心地处理它。
我错过了使用刷新令牌的好处,扩展访问令牌的有效性不一样吗?
@Jay 根据 Microsoft 开发人员网络,HttpOnly 是包含在 Set-Cookie HTTP 响应标头中的附加标志。在生成 cookie 时使用 HttpOnly 标志有助于降低客户端脚本访问受保护 cookie 的风险(如果浏览器支持它)。
@user2010955 访问令牌将由客户端在每个后续请求中发送,这意味着有人捕获的概率很高。
#2 非常不准确。刷新令牌必须存储在服务器端。您不应将 JWT 的“自包含”属性用于刷新令牌。这样做除了更改您的私钥之外,您无法撤销刷新令牌。
H
Hans Z.

假设这是关于 OAuth 2.0,因为它是关于 JWT 和刷新令牌......:

就像访问令牌一样,原则上刷新令牌可以是任何东西,包括您描述的所有选项;当授权服务器想要无状态或想要对呈现它的客户端强制执行某种“所有权证明”语义时,可以使用 JWT;请注意,刷新令牌与访问令牌的不同之处在于它不提供给资源服务器,而只提供给首先发布它的授权服务器,因此 JWTs-as-access-tokens 的自包含验证优化确实不适用于取决于数据库安全性/访问权限的刷新令牌;如果其他方/服务器/应用程序/用户可以访问数据库,那么可以(但您的里程可能会因存储加密密钥的位置和方式而异......)授权服务器可能会在同时,取决于客户端用于获取它们的授权;规范包含每个标准化赠款的详细信息和选项


2. 您应该在数据库中存储刷新令牌的哈希值,然后将用户刷新令牌的哈希值与您存储的哈希值进行比较。 “不要在数据库中存储纯文本密码”的规则如下。考虑一个令牌,例如您为用户创建的随机密码。
此外,如果您想提供更高的安全性,还可以执行刷新令牌轮换。 ITEF RFC 6749 中已经提到了这一点的重要性。如果实施得当,这也有助于识别令牌盗窃场景,即刷新令牌被攻击者盗取。如果您正在寻找更好的解释,请访问此link
我确实建议遵循 this link 来保护前端的 JWT 令牌和刷新令牌。
C
Chetan Goyal

基于此implementation with Node.js of JWT with refresh token

在这种情况下,他们使用 uid 而不是 JWT。当他们刷新令牌时,他们会发送刷新令牌和用户。如果您将其实现为 JWT,则无需发送用户,因为它将位于 JWT 内部。他们在单独的文档(表格)中实现了这一点。这对我来说很有意义,因为用户可以登录不同的客户端应用程序,并且可以通过应用程序获得刷新令牌。如果用户丢失了安装了一个应用程序的设备,则该设备的刷新令牌可能会失效,而不会影响其他已登录的设备。在这个实现中,它使用访问令牌和刷新令牌来响应登录方法。这对我来说似乎是正确的。


通过说“1)在这种情况下,他们使用 uid ...”您的意思是 UUID 吗?
这个更简单的实现怎么样 - 发布 JWT - 当你想刷新时发送旧的 JWT - (你可以用窗口检查 iat) - 根据前一个重新发布一个新的
@adonese 只发送 JWT 您是说要在其中包含 refresh_token 吗?如果是这样,OAuth RFC 6749 明确表示不要将 refresh_token 发送到资源服务器(并且 JWT 将发送到资源服务器):tools.ietf.org/html/rfc6749#section-1.5
D
Dennis Meissel

OAuth 2.0 specification document 中描述了刷新令牌流。

  +--------+                                           +---------------+
  |        |--(A)------- Authorization Grant --------->|               |
  |        |                                           |               |
  |        |<-(B)----------- Access Token -------------|               |
  |        |               & Refresh Token             |               |
  |        |                                           |               |
  |        |                            +----------+   |               |
  |        |--(C)---- Access Token ---->|          |   |               |
  |        |                            |          |   |               |
  |        |<-(D)- Protected Resource --| Resource |   | Authorization |
  | Client |                            |  Server  |   |     Server    |
  |        |--(E)---- Access Token ---->|          |   |               |
  |        |                            |          |   |               |
  |        |<-(F)- Invalid Token Error -|          |   |               |
  |        |                            +----------+   |               |
  |        |                                           |               |
  |        |--(G)----------- Refresh Token ----------->|               |
  |        |                                           |               |
  |        |<-(H)----------- Access Token -------------|               |
  +--------+           & Optional Refresh Token        +---------------+
  
  
  (A)  The client requests an access token by authenticating with the
       authorization server and presenting an authorization grant.
  
  (B)  The authorization server authenticates the client and validates
       the authorization grant, and if valid, issues an access token
       and a refresh token.
  
  (C)  The client makes a protected resource request to the resource
       server by presenting the access token.
  
  (D)  The resource server validates the access token, and if valid,
       serves the request.
  
  (E)  Steps (C) and (D) repeat until the access token expires.  If the
       client knows the access token expired, it skips to step (G);
       otherwise, it makes another protected resource request.
  
  (F)  Since the access token is invalid, the resource server returns
       an invalid token error.
  
  (G)  The client requests a new access token by authenticating with
       the authorization server and presenting the refresh token.  The
       client authentication requirements are based on the client type
       and on the authorization server policies.
  
  (H)  The authorization server authenticates the client and validates
       the refresh token, and if valid, issues a new access token (and,
       optionally, a new refresh token).

关于你的问题:

它是另一个 JWT 刷新令牌必须存储在服务器端 是


在资源服务器上同时处理访问和刷新令牌有什么安全风险?