You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}

关键修正说明

  1. 直接对SHA-256哈希的二进制数据做base64url编码,完全符合PKCE RFC 7636规范;
  2. 修复了encode函数的参数错误,移除不必要的async(btoa是同步操作);
  3. 补充dec2hex函数,确保随机code verifier能正常生成。

内容的提问来源于stack exchange,提问作者Epic Programmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:55:15