Okta PKCE认证出现「PKCE code challenge包含非法字符」错误的求助(base64含+和=)
Okta PKCE认证出现「PKCE code challenge包含非法字符」错误的求助(base64含+和=)
兄弟我之前也踩过这个一模一样的坑!问题出在Okta要求的不是标准Base64编码,而是URL安全的Base64(也就是Base64URL),这俩的区别刚好就是你遇到的+和=字符——这些在标准Base64里合法,但不符合PKCE规范的要求。
具体原因
PKCE的官方规范明确规定:code_challenge必须使用Base64URL编码,并且要去掉末尾的填充字符=。而标准Base64里的+、/和=都是URL里的特殊字符,Okta严格遵循了这个规范,所以直接传标准Base64的哈希就会触发非法字符的错误。
解决方法
修改你生成hash的代码,把标准Base64转换成Base64URL格式:
createChallenge() { const randomString = "ddd"; const hash = node_crypto.createHash('sha256') .update(randomString) .digest('base64') // 替换标准Base64的特殊字符为URL安全版本 .replace(/\+/g, '-') .replace(/\//g, '_') // 去掉末尾的所有=填充符 .replace(/=+$/, ''); const challenge = { hash: hash, method: 'sha256', secretString: randomString }; return challenge; }
举个直观的例子
你用"ddd"生成的标准Base64哈希是77+9x89C2T+6N2P2/5R4hQ==,经过上面的转换后会变成77-9x89C2T-6N2P2_5R4hQ,这个就是Okta能接受的合法code_challenge了。
另外补个小提醒:后面用code_verifier交换token的时候,verifier本身不需要编码,但如果你的verifier包含特殊字符,要确保它符合PKCE要求——只能是字母、数字、-、.、_、~这些字符。
内容来源于stack exchange
相关产品推荐
相关产品推荐

