OAuth 2 中的不记名令牌和 token_type 是啥?
Posted
技术标签:
【中文标题】OAuth 2 中的不记名令牌和 token_type 是啥?【英文标题】:What are Bearer Tokens and token_type in OAuth 2?OAuth 2 中的不记名令牌和 token_type 是什么? 【发布时间】:2011-08-21 00:32:53 【问题描述】:我正在尝试实现 OAuth 2 规范中的 Resource Owner & Password Credentials 流。我无法理解带有有效响应的token_type
值。在规范中,所有示例都显示"token_type":"example"
,但说应该是
token_type 必需的。发行的令牌类型,如中所述 Section 7.1。值不区分大小写。
谁能给我解释一下?
【问题讨论】:
【参考方案1】:token_type
是Access Token generate call to Authorization server中的一个参数,它本质上代表了一个access_token将如何被生成和呈现给资源访问调用。
您在对授权服务器的访问令牌生成调用中提供 token_type。
如果您选择 Bearer
(大多数实现的默认设置),则会生成 access_token
并将其发回给您。 Bearer 可以简单的理解为“赋予这个token的持有者访问权”。一个有效的令牌,不问任何问题。另一方面,如果您选择Mac
和sign_type
(在大多数实现中默认为hmac-sha-1
),则会生成访问令牌并在密钥管理器中作为一个属性作为秘密保存,并且将加密的秘密作为@发送回987654328@.
是的,您可以使用自己的 token_type
实现,但这可能没有多大意义,因为开发人员需要遵循您的流程,而不是 OAuth 的标准实现。
【讨论】:
我发现“允许访问此令牌的持有者”更容易理解。这相当于开出一张支票“给支票的持票人”。 @NVM 感谢您的建议,这当然是有道理的。我也更新了。【参考方案2】:任何人都可以将“token_type”定义为 OAuth 2.0 扩展,但目前“不记名”令牌类型是最常见的一种。
https://www.rfc-editor.org/rfc/rfc6750
基本上这就是 Facebook 所使用的。不过,它们的实现与最新规范相比有些落后。
如果您想比 Facebook 更安全(或与具有“签名”的 OAuth 1.0 一样安全),您可以使用“mac”令牌类型。
但是,由于 mac 规范仍在迅速变化,这将是一个艰难的过程。
https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-http-mac-05
【讨论】:
【参考方案3】:来自RFC 6750, Section 1.2:
不记名令牌
一种安全令牌,拥有该令牌的任何一方(“持有者”)可以以任何其他拥有它的一方可以使用的任何方式使用令牌。使用不记名令牌不需要不记名证明拥有加密密钥材料(所有权证明)。
承载令牌或刷新令牌由身份验证服务器为您创建。当用户对您的应用程序(客户端)进行身份验证时,身份验证服务器会为您生成承载令牌(刷新令牌),然后您可以使用该令牌获取访问令牌。
承载令牌通常是身份验证服务器创建的某种神秘值,它不是随机的,它是根据授予您访问权限的用户和您的应用程序获得访问权限的客户端创建的。
另请参阅:Mozilla MDN Header Information。
【讨论】:
以上是关于OAuth 2 中的不记名令牌和 token_type 是啥?的主要内容,如果未能解决你的问题,请参考以下文章
当我在授权标头中发送有效的不记名令牌时,为啥我的 Spring-Cloud Gateway / OAuth2-Client 没有通过身份验证?
从 Spotify 请求访问令牌时出现错误“仅支持有效的不记名身份验证”
保护 oauth 不记名令牌免受 javascript 应用程序中的 XSS、CSRF 等攻击