Expo + Auth0 集成PKCE授权流报错:无法验证code verifier
PKCE code verifier 校验失败问题解决方案
根因定位
你提供的base64URLEncode实现不符合Base64URL编码规范,这是触发错误的核心原因:
标准Base64URL编码规则要求:
- 将
+替换为- - 将
/替换为_ - 移除末尾的填充字符
=
你的代码中将/错误替换为了-,导致生成的code_challenge和Auth0侧计算的结果不匹配,最终校验失败。
修复后的代码
import crypto from "crypto" // Node crypto package const base64URLEncode = (str) => { return str.toString('base64') .replace(/\+/g, '-') .replace(/\//g, '_') // 此处将/替换为_,而非- .replace(/=/g, '') } const sha256 = (buffer) => { return crypto.createHash('sha256').update(buffer).digest(); } export const createVerifier = () => { return base64URLEncode(crypto.randomBytes(32)); } export const createChallenge = (verifier) => { return base64URLEncode(sha256(verifier)) } export const generateState = () => { return Math.random().toString(36).substring(2, 15) } // 注意:verifier生成后需要持久化存储,换token时必须使用同一个verifier,不能重新生成 const verifier = createVerifier() const challenge = createChallenge(verifier)
其他需确认的配置项
- 发起授权请求时必须指定
code_challenge_method=S256,不能使用plain - verifier生成后必须本地持久化存储,授权完成后取同一个值调用
oauth/token接口,不能生成新的verifier - 调用
oauth/token接口时,传入的redirect_uri必须和授权请求时的redirect_uri完全一致,字符不能有任何差异 - 调用
oauth/token接口时参数名不能写错,verifier对应的参数名为code_verifier
内容的提问来源于stack exchange,提问作者nonamorando
相关产品推荐
相关产品推荐

