跳到主要内容

4. Request Object (请求对象)

4. Request Object (请求对象)

Request Object (第 2.1 节) 用于为 OAuth 2.0 授权请求提供授权请求参数. 其中必须包含处理 OAuth 2.0 [RFC6749] 授权请求所需的全部参数 (含扩展参数), 但不得包含本文档定义的 requestrequest_uri 参数. 参数表示为对象的 JWT Claims. 参数名与字符串值必须作为 JSON 字符串包含. 由于 Request Object 跨域处理且可能处于封闭生态之外, 按 [RFC8259] 第 8.1 节, 这些 JSON 字符串必须使用 UTF-8 [RFC3629] 编码. 数值必须作为 JSON 数字包含. Request Object 可以包含任意扩展参数. 该 JSON [RFC8259] 对象构成 JWT [RFC7519] 所定义的 JWT Claims Set, 随后进行签名或签名并加密.

签名使用 JSON Web Signature (JWS) [RFC7515], 结果为经 JWS 签名的 JWT [RFC7519]. 若已签名, Authorization Request Object 应该包含声明 iss (issuer, 签发者) 与 aud (audience, 受众), 语义与 JWT [RFC7519] 规范相同. aud 的值应为授权服务器 (AS) 的 issuer 取值, 见 RFC 8414 [RFC8414].

加密使用 JWE [RFC7516]. 同时应用签名与加密时, JWT 必须先签名再加密, 见 [RFC7519] 第 11.2 节. 结果为 Nested JWT (嵌套 JWT), 见 [RFC7519].

客户端决定用于签名与加密 Request Object 的算法. 所选算法须为客户端与授权服务器双方支持. 客户端可在动态客户端注册元数据 [RFC7591] 中告知授权服务器其支持的算法, 具体为元数据值 request_object_signing_alg, request_object_encryption_algrequest_object_encryption_enc. 同理, 授权服务器可在授权服务器元数据 [RFC8414] 中告知客户端其支持的算法, 具体为元数据值 request_object_signing_alg_values_supported, request_object_encryption_alg_values_supportedrequest_object_encryption_enc_values_supported.

Request Object 可按值发送, 见 第 5.1 节, 或按引用发送, 见 第 5.2 节. Request Object 中不得包含 requestrequest_uri 参数.

Request Object (第 2.1 节) 的媒体类型 [RFC2046] 为 application/oauth-authz-req+jwt. 注意部分既有部署可能改用类型 application/jwt.

以下为 Request Object 在 base64url [RFC7515] 编码与签名之前 Claims 的示例, 含扩展参数 noncemax_age:

{
"iss": "s6BhdRkqt3",
"aud": "https://server.example.com",
"response_type": "code id_token",
"client_id": "s6BhdRkqt3",
"redirect_uri": "https://client.example.org/cb",
"scope": "openid",
"state": "af0ifjsldkj",
"nonce": "n-0S6_WzA2Mj",
"max_age": 86400
}

使用 RS256 算法 [RFC7518] 签名后得到下列 Request Object 值 (为显示仅对值内换行):

eyJhbGciOiJSUzI1NiIsImtpZCI6ImsyYmRjIn0.ewogICAgImlzcyI6ICJzNkJoZF
JrcXQzIiwKICAgICJhdWQiOiAiaHR0cHM6Ly9zZXJ2ZXIuZXhhbXBsZS5jb20iLAog
ICAgInJlc3BvbnNlX3R5cGUiOiAiY29kZSBpZF90b2tlbiIsCiAgICAiY2xpZW50X2
lkIjogInM2QmhkUmtxdDMiLAogICAgInJlZGlyZWN0X3VyaSI6ICJodHRwczovL2Ns
aWVudC5leGFtcGxlLm9yZy9jYiIsCiAgICAic2NvcGUiOiAib3BlbmlkIiwKICAgIC
JzdGF0ZSI6ICJhZjBpZmpzbGRraiIsCiAgICAibm9uY2UiOiAibi0wUzZfV3pBMk1q
IiwKICAgICJtYXhfYWdlIjogODY0MDAKfQ.Nsxa_18VUElVaPjqW_ToI1yrEJ67BgK
b5xsuZRVqzGkfKrOIX7BCx0biSxYGmjK9KJPctH1OC0iQJwXu5YVY-vnW0_PLJb1C2
HG-ztVzcnKZC2gE4i0vgQcpkUOCpW3SEYXnyWnKzuKzqSb1wAZALo5f89B_p6QA6j6
JwBSRvdVsDPdulW8lKxGTbH82czCaQ50rLAg3EYLYaCb4ik4I1zGXE4fvim9FIMs8O
CMmzwIB5S-ujFfzwFjoyuPEV4hJnoVUmXR_W9typPf846lGwA8h9G9oNTIuX8Ft2jf
pnZdFmLg3_wr3Wa5q3a-lfbgF3S9H_8nN3j1i7tLR_5Nz-g

下列 RSA 公钥以 JSON Web Key (JWK) 形式表示, 可用于校验本示例及后续示例中 Request Object 的签名 (为显示仅对值内换行):

{
"kty":"RSA",
"kid":"k2bdc",
"n":"x5RbkAZkmpRxia65qRQ1wwSMSxQUnS7gcpVTV_cdHmfmG2ltd2yabEO9XadD8
pJNZubINPpmgHh3J1aD9WRwS05ucmFq3CfFsluLt13_7oX5yDRSKX7poXmT_5
ko8k4NJZPMAO8fPToDTH7kHYbONSE2FYa5GZ60CUsFhSonI-dcMDJ0Ary9lxI
w5k2z4TAdARVWcS7sD07VhlMMshrwsPHBQgTatlkxyIHXbYdtak8fqvNAwr7O
lVEvM_Ipf5OfmdB8Sd-wjzaBsyP4VhJKoi_qdgSzpC694XZeYPq45Sw-q51iF
UlcOlTCI7z6jltUtnR6ySn6XDGFnzH5Fe5ypw",
"e":"AQAB"
}