1.4. 访问令牌
访问令牌是用于访问受保护资源的凭据。该字符串代表了颁发给客户端的授权。
即使该字符串是有一定结构的,它也被视作对客户端不透明。客户端禁止期望能够解析访问令牌的值。授权服务器不需要遵循某种一致的访问令牌编码或格式,只需要符合资源服务器的期望即可。
访问令牌代表了特定的访问范围和访问持续时间。这种范围和时间由资源所有者所许可,并被资源服务器和授权服务器所遵从。
取决于授权服务器的具体实现,令牌字符串可能会被资源服务器用于获取授权信息,或者其本身就以某种可验证的方式,包含了这些授权信息(例如承载了签名数据负载的令牌字符串)。令牌获取机制的一个例子是令牌检查 [RFC7662]。在该机制中,资源服务器会访问授权服务器的某个端点,来验证客户端展示的令牌。而结构化令牌格式的一个例子则是访问令牌的 JWT 形式 [RFC9068]。这种方法将访问令牌的数据编码并签名,成为 JSON Web Token [RFC7519]。
客户端想要使用访问令牌,可能需要额外的认证凭据,但这不在本规范的范围内。这些凭据通常被称为发送者约束的访问令牌,例如 DPoP [RFC9449] 和 mTLS [RFC8705]。
访问令牌提供了一层抽象,用资源服务器所能理解的单个令牌,取代了各种授权结构(例如用户名和密码)。这种抽象的好处在于,颁发的访问令牌能够比用来获取它们的授权许可有更强的限制性,并且消除了资源服务器理解多种认证方法的需要。
根据资源服务器的安全要求,访问令牌可以采用不同的格式、结构和使用方法(例如加密属性)。访问令牌的属性,以及访问受保护资源的方法,不限于本规范的描述。
访问令牌(以及访问令牌的任何私密属性)必须在传输和存储时保持私密,并且只能在授权服务器、该访问令牌有效的资源服务器和该访问令牌被颁发给的客户端之间共享。
授权服务器必须保证访问令牌无法被未授权方生成、修改或者预测并据此创建有效的访问令牌。
1.4.1. 访问令牌的范围
访问令牌被颁发给的客户端,相比起授予其权限的用户,权限应该更少。这被称为有限“范围”的访问令牌。授权服务器和资源服务器可以利用这种范围机制,来限制某一客户端可以访问的资源类型或访问级别。
例如,客户端可能只需要用户资源的“读取”权限,而不需要更新资源,那么客户端就可以请求授权服务器所定义的只读范围,然后获取一个无法用于更新资源的访问令牌。这需要授权服务器、资源服务器和客户端三方的协调。授权服务器赋予客户端请求特定范围的能力,并把这些范围与颁发给客户端的访问令牌关联起来。之后,在碰到有限范围的访问令牌时,资源服务器负责遵从这些范围限制。
OAuth 不定义任何范围值。范围值由授权服务器、OAuth 扩展或配置文件定义。[OpenID] 就是一个这样的扩展,它定义了一系列范围,为用户资料提供了细粒度的访问权限。建议避免自定义范围与已知扩展的范围相冲突。
为了请求有限范围的访问令牌,客户端根据使用的授权类型,在授权或令牌端点上使用范围请求参数。授权服务器则使用范围响应参数,告知客户端颁发的访问令牌的范围。
范围参数的值表示为以空格分隔的、大小写敏感的字符串列表。这些字符串由授权服务器定义。当值包含多个以空格分隔的字符串时,它们的顺序不重要,每个字符串都会向所请求的范围中添加一个访问范围。
scope = scope-token *( SP scope-token )
scope-token = 1*( %x21 / %x23-5B / %x5D-7E )根据授权服务器的策略或资源所有者的指示,授权服务器可以完全或部分忽略客户端所请求的范围。如果颁发的访问令牌的范围与客户端所请求的范围不同,授权服务器必须在令牌响应(第 3.2.3 节)中包含范围响应参数,以告知客户端实际授权的范围。
如果客户端在请求授权时省略了范围参数,那么授权服务器必须要么使用预定义的默认值处理请求,要么拒绝该请求并显示范围无效。授权服务器应该在文档中写明自己的范围要求和默认值(如果定义了的话)。
1.4.2. Bearer 令牌
Bearer 令牌是一种安全令牌。任何持有该令牌的人(“持有者”)都能以相同方式使用该令牌。持有者不需要证明其拥有加密密钥(持有证明),也能够使用 Bearer 令牌。
持有证明规范可以加强 Bearer 令牌,例如 DPoP [RFC9449] 和 mTLS [RFC8705],使其提供持有证明的特性。
为了防止访问令牌的泄露,客户端和资源服务器之间的通信交互必须使用第 1.5 节中描述的私密性和完整性保护。
Bearer 令牌没有特定的结构或格式要求。如果 Bearer 令牌是对授权信息的引用,那么这样的引用必须对攻击者来说是不可猜测的,例如使用足够长的加密随机字符串。如果 Bearer 令牌使用编码机制,在其本身中包含授权信息,那么访问令牌必须有足够强的完整性保护,以防止令牌被修改。访问令牌的编码和签名机制的一个例子是访问令牌的 JWT 形式 [RFC9068]。
1.4.3. 发送者约束的访问令牌
发送者约束的访问令牌能将访问令牌的使用权绑定到特定的发送方。该发送方应当证明其知晓某个密钥,作为接收方(例如资源服务器)接受该访问令牌的前置条件。
授权服务器和资源服务器应该使用发送者约束的访问令牌机制,例如 OAuth 持有证明展示(DPoP)[RFC9449] 或 OAuth 2.0 的双向 TLS(mTLS)[RFC8705]。请参考 [I-D.ietf-oauth-security-topics] 的第 4.10.1 节,以防止被盗和泄露的访问令牌被滥用。
建议在客户端和资源服务器之间使用端到端的 TLS 协议。如果 TLS 流量需要在中途终止,请参考 [I-D.ietf-oauth-security-topics] 的第 4.13 节获取更多安全建议。