SPA通过PKCE流生成授权码报AADSTS501491错误咨询
错误原因
触发AADSTS501491: Invalid size of Code_Challenge parameter报错的直接原因是传入的code_challenge参数长度不符合Azure AD的PKCE校验规则。当前传入的code_challenge长度为96字符,远超出S256校验模式要求的合法长度范围。
code_challenge 合法取值要求
Azure AD对PKCE流的code_challenge参数校验规则与OAuth2.0官方标准完全一致:
- 当
code_challenge_method设置为S256(平台推荐的高安全级别校验方式):code_challenge是对合法code_verifier做SHA256哈希后,经URL安全Base64编码得到的固定长度字符串,长度为43~44字符。 - 当
code_challenge_method设置为plain(低安全级别,仅建议测试场景使用):code_challenge值与code_verifier完全一致,长度要求为43~128字符,仅允许包含大小写字母、数字、-、_、.、~几类字符,不支持其他特殊符号。
code_challenge 正确生成方式
code_challenge必须基于合法的code_verifier派生,不能随意构造字符串传入,完整生成步骤如下:
- 先生成符合要求的
code_verifiercode_verifier是一个高熵随机字符串,需满足:
- 长度在43~128字符区间
- 仅使用合法字符集:
A-Z、a-z、0-9、-、_、.、~
合法示例:fJd92sl_kjf.DSjf032jfds90jfdslkj32r43jfds9032jfdslk42
- 基于
code_verifier生成S256模式的code_challenge
- 第一步:将
code_verifier以ASCII编码转成字节数组,对字节数组做SHA256哈希,得到32字节长度的二进制哈希结果 - 第二步:对二进制哈希结果做URL安全的Base64编码:将标准Base64结果中的
+替换为-、/替换为_,同时去掉末尾所有用于填充的=符号 - 最终得到的43~44位字符串就是可直接传入请求的合法
code_challenge
可以直接用以下PowerShell脚本快速生成符合要求的两个参数,无需手动计算:
# 生成随机code_verifier $charSet = (48..57) + (65..90) + (97..122) + 45,95,46,126 $codeVerifier = -join ($charSet | Get-Random -Count 64 | ForEach-Object {[char]$_}) Write-Host "请妥善保存code_verifier,后续换令牌需要使用:`n$codeVerifier`n" # 生成对应S256格式的code_challenge $sha256 = [System.Security.Cryptography.SHA256]::Create() $hashBytes = $sha256.ComputeHash([System.Text.Encoding]::ASCII.GetBytes($codeVerifier)) $codeChallenge = [System.Convert]::ToBase64String($hashBytes).TrimEnd('=').Replace('+','-').Replace('/','_') Write-Host "授权请求使用的code_challenge:`n$codeChallenge"
Postman调试注意事项
- 生成的
code_verifier必须临时存储,后续调用/token端点用授权码兑换访问令牌时,需要传入同一个code_verifier做校验,传入值不匹配会触发PKCE校验失败错误。 - 不要对哈希结果做十六进制编码,必须使用URL安全Base64编码,否则会出现长度不合法、哈希不匹配的问题。
内容的提问来源于stack exchange,提问作者Shashank
相关产品推荐
相关产品推荐

