为啥使用 JWT 刷新令牌

Posted

技术标签:

【中文标题】为啥使用 JWT 刷新令牌【英文标题】:Why use a JWT Refresh Token为什么使用 JWT 刷新令牌 【发布时间】:2021-12-02 16:04:45 【问题描述】:

为什么使用 JWT 刷新令牌。 在https://www.oauth.com/oauth2-servers/access-tokens/refreshing-access-tokens/ 要使用我需要发送的刷新令牌

POST / oauth / HTTP / 1.1 token
Host: authorization-server.com
 
grant_type = refresh_token
& refresh_token = xxxxxxxxxxx
& client_id = xxxxxxxxxx
& client_secret = xxxxxxxxxx

使用 refresh_token 有什么意义,因为我可以直接请求访问令牌

POST / HTTP token / 1.1
Host: authorization-server.com
 
grant_type = client_credentials
& client_id = xxxxxxxxxx
& client_secret = xxxxxxxxxx

我要连接的服务需要 client_id 和 client_secret 来刷新令牌。没有这些参数,它返回


     "error": "invalid_request",
     "error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed."

附加client_id和client_secret时,返回一个有效的JWT

【问题讨论】:

出于安全考虑,访问令牌仅在短时间内有效。刷新令牌用于刷新访问令牌,无需再次登录。有关此主题的更多信息:auth0.com/blog/…auth0.com/docs/security/tokens/refresh-tokens 我了解访问令牌和刷新令牌之间的区别。我不明白为什么在刷新令牌请求中需要 client_id 和 client_secret。这意味着我必须从用户那里保存或下载 client_secret。 【参考方案1】:

首先我引用official documentation:

客户端身份验证(如果客户端获得了机密,则需要): 通常,刷新令牌仅用于机密客户端。但是,由于可以在没有客户端密码的情况下使用授权代码流,因此没有密码的客户端也可以使用刷新授权。如果客户端获得了一个秘密,那么客户端必须验证这个请求。通常,该服务将允许附加请求参数 client_id 和 client_secret,或者接受 HTTP Basic auth 标头中的客户端 ID 和密钥。如果客户端没有密钥,则此请求中将不存在客户端身份验证。

一些应用程序(例如网络应用程序)可以安全地存储客户端的秘密,因此最好在刷新令牌的流程中提供客户端的秘密,但是对于一些不能安全地存储客户端的秘密的应用程序(例如移动应用程序),建议发出一个不需要客户端密码的刷新令牌。

此外,一些授权过程可以在没有客户端密码的情况下完成,因此必须可以在不需要客户端密码的情况下发布刷新令牌。

如果客户端获得了一个秘密,那么它必须为刷新令牌流提供秘密。

不同的服务通常可以选择颁发需要身份验证的刷新令牌和不需要身份验证的刷新令牌。

对于您正在使用的服务,检查它是否可以选择向您颁发不需要客户端密码的刷新令牌。

【讨论】:

没有。 REST API 需要 client_id 和 client_secret 来刷新令牌。 在这种情况下,您必须联系服务支持。

以上是关于为啥使用 JWT 刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章

JWT, 为啥需要刷新令牌?

为啥不将 JWT 访问令牌存储在内存中并在 cookie 中刷新令牌?

为啥在每个请求上刷新 JUST 令牌是个坏主意?

过期后使用刷新令牌获取访问令牌(JWT)

刷新令牌和 JWT 令牌交互

使用 JWT 刷新令牌如何安全?