Skip to main content

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

如果两个值相等, 则只要请求中没有其他错误, 授权服务器就可以提供令牌. 如果值不相等, 则必须拒绝请求并返回错误.