跳到主要内容

附录 A. 其他令牌交换示例

以下各节提供两个令牌交换示例, 分别说明模拟 (impersonation) 和委派 (delegation). 额外的换行和缩进仅用于显示.

A.1. 模拟令牌交换示例

A.1.1. 令牌交换请求

在以下令牌交换请求中, 客户端请求一个具有模拟语义的令牌. 只有 subject_token 而没有 actor_token 时无法进行委派. 客户端告知授权服务器, 它需要一个令牌, 用于逻辑名称为 urn:example:cooperation-context 的目标服务.

POST /as/token.oauth2 HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
&audience=urn%3Aexample%3Acooperation-context
&subject_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0.eyJhdWQiOiJodHRwc
zovL2FzLmV4YW1wbGUuY29tIiwiaXNzIjoiaHR0cHM6Ly9vcmlnaW5hbC1pc3N1ZXI
uZXhhbXBsZS5uZXQiLCJleHAiOjE0NDE5MTA2MDAsIm5iZiI6MTQ0MTkwOTAwMCwic
3ViIjoiYmRjQGV4YW1wbGUubmV0Iiwic2NvcGUiOiJvcmRlcnMgcHJvZmlsZSBoaXN
0b3J5In0.PRBg-jXn4cJuj1gmYXFiGkZzRuzbXZ_sDxdE98ddW44ufsbWLKd3JJ1VZ
hF64pbTtfjy4VXFVBDaQpKjn5JzAw
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt

图 10: 令牌交换请求

A.1.2. Subject Token 声明

前一请求中的 subject_token 是一个 JWT, 下面展示了解码后的 JWT Claims Set. 该 JWT 预期在特定时间窗口内由授权服务器使用. JWT 的 subject ([email protected]) 是请求新令牌所代表的一方.

{
"aud":"https://as.example.com",
"iss":"https://original-issuer.example.net",
"exp":1441910600,
"nbf":1441909000,
"sub":"[email protected]",
"scope":"orders profile history"
}

图 11: Subject Token 声明

A.1.3. 令牌交换响应

下面所示令牌交换响应中的 access_token 参数包含客户端请求的新令牌. 响应中的其他参数表明该令牌是一个 bearer 访问令牌, 一小时后过期.

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store

{
"access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6IjcyIn0.eyJhdWQiOiJ1cm4
6ZXhhbXBsZTpjb29wZXJhdGlvbi1jb250ZXh0IiwiaXNzIjoiaHR0cHM6Ly9hcy5l
eGFtcGxlLmNvbSIsImV4cCI6MTQ0MTkxMzYxMCwic3ViIjoiYmRjQGV4YW1wbGUub
mV0Iiwic2NvcGUiOiJvcmRlcnMgcHJvZmlsZSBoaXN0b3J5In0.rMdWpSGNACTvnF
uOL74sYZ6MVuld2Z2WkGLmQeR9ztj6w2OXraQlkJmGjyiCq24kcB7AI2VqVxl3wSW
nVKh85A",
"issued_token_type":
"urn:ietf:params:oauth:token-type:access_token",
"token_type":"Bearer",
"expires_in":3600
}

图 12: 令牌交换响应

A.1.4. 已签发令牌声明

下面展示了已签发令牌解码后的 JWT Claims Set. 新 JWT 由授权服务器签发, 并预期在过期前的任意时间由逻辑名称为 urn:example:cooperation-context 的系统实体使用. JWT 的 subject ("sub") 与用于发起请求的令牌的 subject 相同, 这实际上使客户端能够使用该令牌, 在逻辑名称为 urn:example:cooperation-context 的系统实体处模拟该 subject.

{
"aud":"urn:example:cooperation-context",
"iss":"https://as.example.com",
"exp":1441913610,
"sub":"[email protected]",
"scope":"orders profile history"
}

图 13: 已签发令牌声明

A.2. 委派令牌交换示例

A.2.1. 令牌交换请求

在以下令牌交换请求中, 客户端请求一个令牌, 并同时提供 subject_tokenactor_token. 客户端告知授权服务器, 它需要一个令牌, 用于逻辑名称为 urn:example:cooperation-context 的目标服务. 授权服务器上的策略规定所签发的令牌应为组合令牌.

POST /as/token.oauth2 HTTP/1.1
Host: as.example.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
&audience=urn%3Aexample%3Acooperation-context
&subject_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0.eyJhdWQiOiJodHRwc
zovL2FzLmV4YW1wbGUuY29tIiwiaXNzIjoiaHR0cHM6Ly9vcmlnaW5hbC1pc3N1ZXI
uZXhhbXBsZS5uZXQiLCJleHAiOjE0NDE5MTAwNjAsInNjb3BlIjoic3RhdHVzIGZlZ
WQiLCJzdWIiOiJ1c2VyQGV4YW1wbGUubmV0IiwibWF5X2FjdCI6eyJzdWIiOiJhZG1
pbkBleGFtcGxlLm5ldCJ9fQ.4rPRSWihQbpMIgAmAoqaJojAxj-p2X8_fAtAGTXrvM
xU-eEZHnXqY0_AOZgLdxw5DyLzua8H_I10MCcckF-Q_g
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt
&actor_token=eyJhbGciOiJFUzI1NiIsImtpZCI6IjE2In0.eyJhdWQiOiJodHRwczo
vL2FzLmV4YW1wbGUuY29tIiwiaXNzIjoiaHR0cHM6Ly9vcmlnaW5hbC1pc3N1ZXIuZ
XhhbXBsZS5uZXQiLCJleHAiOjE0NDE5MTAwNjAsInN1YiI6ImFkbWluQGV4YW1wbGU
ubmV0In0.7YQ-3zPfhUvzje5oqw8COCvN5uP6NsKik9CVV6cAOf4QKgM-tKfiOwcgZ
oUuDL2tEs6tqPlcBlMjiSzEjm3yBg
&actor_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt

图 14: 令牌交换请求

A.2.2. Subject Token 声明

前一请求中的 subject_token 是一个 JWT, 下面展示了解码后的 JWT Claims Set. 该 JWT 预期在特定过期时间之前由授权服务器使用. JWT 的 subject ([email protected]) 是请求新令牌所代表的一方.

{
"aud":"https://as.example.com",
"iss":"https://original-issuer.example.net",
"exp":1441910060,
"scope":"status feed",
"sub":"[email protected]",
"may_act":
{
"sub":"[email protected]"
}
}

图 15: Subject Token 声明

A.2.3. Actor Token 声明

前一请求中的 actor_token 是一个 JWT, 下面展示了解码后的 JWT Claims Set. 该 JWT 同样预期在特定过期时间之前由授权服务器使用. JWT 的 subject ([email protected]) 是将使用所请求安全令牌的 actor.

{
"aud":"https://as.example.com",
"iss":"https://original-issuer.example.net",
"exp":1441910060,
"sub":"[email protected]"
}

图 16: Actor Token 声明

A.2.4. 令牌交换响应

下面所示令牌交换响应中的 access_token 参数包含客户端请求的新令牌. 响应中的其他参数表明该令牌是一个一小时后过期的 JWT, 并且由于签发的令牌不是访问令牌, 因而访问令牌类型不适用.

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache, no-store

{
"access_token":"eyJhbGciOiJFUzI1NiIsImtpZCI6IjcyIn0.eyJhdWQiOiJ1cm4
6ZXhhbXBsZTpjb29wZXJhdGlvbi1jb250ZXh0IiwiaXNzIjoiaHR0cHM6Ly9hcy5l
eGFtcGxlLmNvbSIsImV4cCI6MTQ0MTkxMzYxMCwic2NvcGUiOiJzdGF0dXMgZmVlZ
CIsInN1YiI6InVzZXJAZXhhbXBsZS5uZXQiLCJhY3QiOnsic3ViIjoiYWRtaW5AZX
hhbXBsZS5uZXQifX0.3paKl9UySKYB5ng6_cUtQ2qlO8Rc_y7Mea7IwEXTcYbNdwG
9-G1EKCFe5fW3H0hwX-MSZ49Wpcb1SiAZaOQBtw",
"issued_token_type":"urn:ietf:params:oauth:token-type:jwt",
"token_type":"N_A",
"expires_in":3600
}

图 17: 令牌交换响应

A.2.5. 已签发令牌声明

下面展示了已签发令牌解码后的 JWT Claims Set. 新 JWT 由授权服务器签发, 并预期在过期前的任意时间由逻辑名称为 urn:example:cooperation-context 的系统实体使用. JWT 的 subject ("sub") 与用于发起请求的 subject_token 的 subject 相同. JWT 的 actor ("act") 与用于发起请求的 actor_token 的 subject 相同. 这表示发生了委派, 并将 [email protected] 标识为当前 actor, 该 actor 已被委派权限以代表 [email protected] 行事.

{
"aud":"urn:example:cooperation-context",
"iss":"https://as.example.com",
"exp":1441913610,
"scope":"status feed",
"sub":"[email protected]",
"act":
{
"sub":"[email protected]"
}
}

图 18: 已签发令牌声明