跳到主要内容

Appendix B. S256 code_challenge_method 示例

client 使用合适 random number generator 的输出创建 32-octet sequence. 本示例中表示该值的 octets (使用 JSON array notation) 为:

[116, 24, 223, 180, 151, 153, 224, 37, 79, 250, 96, 125, 216, 173,
187, 186, 22, 212, 37, 77, 105, 214, 191, 240, 91, 88, 5, 88, 83,
132, 141, 121]

将该 octet sequence 编码为 base64url 会得到 code_verifier 的值:

dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

随后通过 SHA256 hash function 对 code_verifier 进行 hash, 产生:

[19, 211, 30, 150, 26, 26, 216, 236, 47, 22, 177, 12, 76, 152, 46,
8, 118, 168, 120, 173, 109, 241, 68, 86, 110, 225, 137, 74, 203,
112, 249, 195]

将该 octet sequence 编码为 base64url 会得到 code_challenge 的值:

E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM

authorization request 包含:

code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
&code_challenge_method=S256

authorization server 随后将 code_challenge 和 code_challenge_method 与授予 client 的 code 一起记录.

在发往 token_endpoint 的 request 中, client 包含 authorization response 中收到的 code, 以及额外 parameter:

code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

authorization server 检索 code grant 的信息. 基于记录的 code_challenge_method 为 S256, 它随后对 code_verifier 的值进行 hash 并 base64url-encode:

BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))

随后将计算得到的值与 "code_challenge" 的值进行比较:

BASE64URL-ENCODE(SHA256(ASCII(code_verifier))) == code_challenge

如果两个值相等, 且 request 中没有其他 errors, 则 authorization server 可以提供 tokens. 如果两个值不相等, 则必须拒绝 request 并返回 error.