2.2. Access Token Request (访问令牌请求)
2.2. Access Token Request (访问令牌请求)
当在发往令牌端点 (token endpoint) 的访问令牌请求中使用 resource 参数时, 对所有许可类型 (grant type) 而言, 它表示客户端打算使用所请求访问令牌的目标服务或受保护资源.
授权服务器在履行访问令牌请求时可接受的资源值完全由其本地策略或配置决定. 对于 refresh_token 或 authorization_code 许可类型请求, 此类策略可将可接受资源限制为资源所有者原先授予的资源或其子集. 在 authorization_code 情形中, 若所请求资源为原先授予资源集合的子集, 授权服务器将基于该子集签发访问令牌, 而返回的任何刷新令牌 (refresh token) 仍绑定于完整原始许可.
请求令牌时, 客户端可通过 resource 参数指明拟使用该令牌的目标服务, 并可通过 scope 参数指明所请求令牌的期望 scope. 此类请求的语义是: 客户端请求获得具有所请求 scope 且可在所有请求的目标服务处使用的令牌. 从效果上看, 令牌所请求的访问权限是所有目标服务上所有 scope 的笛卡尔积 (cartesian product). 在签发访问令牌时, 在可行范围内, 授权服务器应将访问令牌关联的 scope 值缩小 (downscope) 到各资源能够处理且需要知晓的值. (此处 "downscope" 指给予比资源所有者原先授权更少的权限.) 这进一步改善隐私, 因为 scope 值列表暗示资源所有者使用所列多种服务; 将令牌缩小到特定服务所需范围可限制此类信息在不同服务间泄露的程度. 如 [RFC6749] 第 5.1 节规定, 当有效 scope 与客户端请求的 scope 不同时, 授权服务器必须在 scope 响应参数值中向客户端指明访问令牌的有效 scope.
接续图 2 所示授权码流授权请求, 以下示例给出 authorization_code 许可类型的访问令牌请求 (图 3) 与响应 (图 4): 客户端告知授权服务器其希望访问令牌用于 https://cal.example.com/ (为显示起见, 额外的换行与缩进仅作排版).
POST /as/token.oauth2 HTTP/1.1
Host: authorization-server.example.com
Authorization: Basic czZCaGRSa3F0Mzpoc3FFelFsVW9IQUU5cHg0RlNyNHlJ
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
&code=10esc29BWC2qZB0acc9v8zAv9ltc2pko105tQauZ
&resource=https%3A%2F%2Fcal.example.com%2F
图 3: 访问令牌请求
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store
{
"access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6Ijc3In0.eyJpc3MiOi
JodHRwOi8vYXV0aG9yaXphdGlvbi1zZXJ2ZXIuZXhhbXBsZS5jb20iLCJzdWI
iOiJfX2JfYyIsImV4cCI6MTU4ODQyMDgwMCwic2NvcGUiOiJjYWxlbmRhciIs
ImF1ZCI6Imh0dHBzOi8vY2FsLmV4YW1wbGUuY29tLyJ9.nNWJ2dXSxaDRdMUK
lzs-cYIj8MDoM6Gy7pf_sKrLGsAFf1C2bDhB60DQfW1DZL5npdko1_Mmk5sUf
zkiQNVpYw",
"token_type":"Bearer",
"expires_in":3600,
"refresh_token":"4LTC8lb0acc6Oy4esc1Nk9BWC0imAwH7kic16BDC2",
"scope":"calendar"
}
图 4: 访问令牌响应
图 5 展示随后的访问令牌请求 (使用刷新令牌): 客户端告知授权服务器其希望访问令牌用于 https://contacts.example.com/; 图 6 为响应 (为显示起见, 额外的换行与缩进仅作排版).
POST /as/token.oauth2 HTTP/1.1
Host: authorization-server.example.com
Authorization: Basic czZCaGRSa3F0Mzpoc3FFelFsVW9IQUU5cHg0RlNyNHlJ
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token
&refresh_token=4LTC8lb0acc6Oy4esc1Nk9BWC0imAwH7kic16BDC2
&resource=https%3A%2F%2Fcontacts.example.com%2F
图 5: 访问令牌请求
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store
{
"access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6Ijc3In0.eyJpc3MiOi
JodHRwOi8vYXV0aG9yaXphdGlvbi1zZXJ2ZXIuZXhhbXBsZS5jb20iLCJzdWI
iOiJfX2JfYyIsImV4cCI6MTU4ODQyMDgyNiwic2NvcGUiOiJjb250YWN0cyIs
ImF1ZCI6Imh0dHBzOi8vY29udGFjdHMuZXhhbXBsZS5jb20vIn0.5f4yhqazc
OSlJw4y94KPeWNEFQqj2cfeO8x4hr3YbHtIl3nQXnBMw5wREY5O1YbZED-GfH
UowfmtNaA5EikYAw",
"token_type":"Bearer",
"expires_in":3600,
"scope":"contacts"
}
图 6: 访问令牌响应