【问题标题】:OAuth Client Credential Flow - Refresh TokensOAuth 客户端凭据流 - 刷新令牌
【发布时间】:2017-09-06 12:36:06
【问题描述】:

情景

我最近构建了一个 API,并使用 OAuth Bearer Access Tokens 保护了它的资源。

我使用了Client_Credentials Flow,因为它将被客户端而不是用户访问。

事情是这样的,当客户成功提供 client_idclient_secret 时,他们会收到如下响应:-

{
  "access_token": "<Access Token>",
  "token_type": "bearer",
  "expires_in": 1199,
  "refresh_token": "<Refresh Token>"
}

刷新令牌。

对刷新令牌了解不多,我立即假设客户端能够向 OAuth 服务器提供 refresh_token 以检索新的 Access_Token

这“有点”正确。

为了使用refresh_token,客户端仍然需要传递client_idclient_secret 以及refresh_token 以获得新的访问令牌。

grant_type 也需要改为refresh_token

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

【问题讨论】:

  • 这个问题与 C#/ASP.Net 无关,它适用于任何构建 OAuth2 API 的人。我对其进行了编辑以使其更广泛地适用。 (好问题!)

标签: oauth-2.0 oauth


【解决方案1】:

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

从我的角度来看,授权服务器不应该在客户端凭据授权的情况下发布刷新令牌,因为访问令牌发布过程将采取额外且不必要的步骤:

颁发 client_credentials 授权类型:

  • 第一步:客户端身份验证(客户端密码、断言...)
  • OK 访问令牌已颁发

以 refresh_token 授权类型发行:

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

【讨论】:

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

好处是他请求令牌的寿命通常比访问令牌长得多。

访问令牌用于与资源服务器通信。 与授权服务器通信时使用请求令牌。

您可以将其解读为您可能已获得授权,但您的授权的确切延长需要不时重新评估。所以请求令牌有它的用途。

【讨论】:

  • “请求令牌”是指刷新令牌吗?
猜你喜欢
  • 2018-12-14
  • 2019-05-24
  • 2019-01-08
  • 1970-01-01
  • 2023-03-25
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
相关资源
最近更新 更多