OAuth2授权客户端报错:Code verifier is invalid问题求助
排查OAuth2 PKCE "Code verifier is invalid"错误的原因
你的代码里有几个关键问题导致了验证失败,逐一拆解:
- encode函数参数错误:函数定义的参数是
input,但返回语句里误用了未定义的string变量,这会直接导致编码逻辑失效。 - PKCE挑战生成逻辑不符合规范:PKCE要求对code verifier的SHA-256哈希二进制原始数据做base64url编码,而你的代码把哈希结果转成了十六进制字符串再编码,这完全偏离了标准,服务端自然无法匹配验证。
- 缺失依赖函数:
generateRandomString里用到的dec2hex函数没有实现,会导致无法生成有效的随机code verifier。
修正后的代码
// 修正encode:接收二进制哈希数据,直接转base64url function encode(input: Uint8Array): string { const base64 = btoa(String.fromCharCode(...input)); return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); } // 返回二进制哈希值,不转十六进制 async function digestMessage(message: string): Promise<Uint8Array> { const msgUint8 = new TextEncoder().encode(message); const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8); return new Uint8Array(hashBuffer); } // 补充缺失的dec2hex函数 function dec2hex(dec: number): string { return dec.toString(16).padStart(2, '0'); } function generateRandomString(len?: number): string { const byteLength = Math.ceil((len || 40) / 2); const arr = new Uint8Array(byteLength); window.crypto.getRandomValues(arr); return Array.from(arr, dec2hex).join(''); } async function pkceChallengeFromVerifier(v: string): Promise<string> { const hash = await digestMessage(v); return encode(hash); }
关键修正说明
- 直接对SHA-256哈希的二进制数据做base64url编码,完全符合PKCE RFC 7636规范;
- 修复了encode函数的参数错误,移除不必要的async(btoa是同步操作);
- 补充
dec2hex函数,确保随机code verifier能正常生成。
内容的提问来源于stack exchange,提问作者Epic Programmer
相关产品推荐
相关产品推荐

