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.