Appendix B. Example for the S256 code_challenge_method (S256 code_challenge_method 的示例)
客户端使用合适的随机数生成器的输出来创建 32 个八位字节的序列. 此示例中表示该值的八位字节 (使用 JSON 数组表示法) 为:
[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]
将此八位字节序列编码为 base64url 可提供 code_verifier 的值:
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
然后通过 SHA256 哈希函数对 code_verifier 进行哈希以产生:
[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]
将此八位字节序列编码为 base64url 可提供 code_challenge 的值:
E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
授权请求包括:
code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM
&code_challenge_method=S256
然后, 授权服务器将 code_challenge 和 code_challenge_method 与授予客户端的代码一起记录.
在对 token_endpoint 的请求中, 客户端包括在授权响应中收到的代码以及附加参数:
code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
授权服务器检索代码授权的信息. 基于记录的 code_challenge_method 为 S256, 它然后对 code_verifier 的值进行哈希和 base64url 编码:
BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
然后将计算的值与 "code_challenge" 的值进行比较:
BASE64URL-ENCODE(SHA256(ASCII(code_verifier))) == code_challenge
如果两个值相等, 则只要请求中没有其他错误, 授权服务器就可以提供令牌. 如果值不相等, 则必须拒绝请求并返回错误.