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
次に、code_verifierはSHA256ハッシュ関数を介してハッシュ化され、次のものが生成されます:
[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とともにcode_challengeとcode_challenge_methodを記録します。
token_endpointへのリクエストで、クライアントは、認可レスポンスで受信したcodeと追加パラメータを含めます:
code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
認可サーバーは、code許可の情報を取得します。記録されたcode_challenge_methodがS256であることに基づいて、code_verifierの値をハッシュ化してbase64urlエンコードします:
BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
次に、計算された値を「code_challenge」の値と比較します:
BASE64URL-ENCODE(SHA256(ASCII(code_verifier))) == code_challenge
2つの値が等しい場合、リクエストに他のエラーがない限り、認可サーバーはトークンを提供できます。値が等しくない場合は、リクエストを拒否し、エラーを返さなければなりません。