OAuth 客户端凭据流 - 刷新令牌

Der*_*rek 11 oauth oauth-2.0

情景

我最近构建了一个 API,并使用不OAuth记名访问令牌保护了它的资源。

我已经使用了Client_CredentialsFlow,因为它将由客户端而不是用户访问。

事情是这样的,当客户成功提供了client_id并且client_secret他们收到如下响应时: -

{
  "access_token": "<Access Token>",
  "token_type": "bearer",
  "expires_in": 1199,
  "refresh_token": "<Refresh Token>"
}
Run Code Online (Sandbox Code Playgroud)

刷新令牌。

不太了解刷新令牌,我立即认为客户端将能够提供 OAuth 服务器refresh_token来检索新的Access_Token.

这是“有点”正确的。

为了使用该refresh_token客户端仍然需要通过client_idclient_secret随着refresh_token获得新的访问令牌。

grant_type也需要改变refresh_token

使用此流程的 refresh_token 的好处在哪里?如果我每次都需要传递 client_id 和 client_secret,您肯定会完全避免使用刷新令牌吗?

Flo*_*lli 21

使用客户端凭据授权发布刷新令牌没有任何好处。这就是RFC6749 第 4.4.3 节指出的原因A refresh token SHOULD NOT be included。因此,它的发布由授权服务器决定。

从我的角度来看,授权服务器永远不应该使用客户端凭据授予刷新令牌,因为访问令牌颁发过程将采取额外且不必要的步骤:

使用 client_credentials 授权类型颁发:

  • 第一步:客户端认证(客户端密码、断言...)
  • 发出 OK 访问令牌

使用 refresh_token 授权类型发行:

  • 第一步:客户端认证(客户端密码、断言...)
  • 第二步:刷新令牌验证(过期时间、关联客户端...)
  • 发出 OK 访问令牌

  • 客户端可以使用其凭据接收访问令牌。当您不需要刷新令牌来颁发访问令牌时,为什么要存储和管理刷新令牌? (3认同)
  • 谢谢,最后对规范的实际参考解释了为什么使用刷新令牌对 client_credentials 没有意义。我们之前还有疑问,现在一切都清楚了! (2认同)
  • 但是在以下问题的上下文中使用刷新令牌是否有意义:“它将由客户端而不是用户访问。” 客户端与第三方一样,无需用户交互来更新刷新/访问令牌? (2认同)
  • @TheLegendaryCopyCoder 真的吗?如果您的客户端凭据不安全,您应该真正关心它,因为对授权端点的每个请求都需要机密的客户端身份验证。无论如何,要使用刷新令牌获取新的访问令牌,您还需要发送客户端凭据。那么,当您可以直接获取访问令牌时,存储刷新令牌有什么意义呢? (2认同)