PKCE code_verifier 与 code_challenge 生成器

生成或粘贴 code_verifier,即可得到 OAuth 2.0 PKCE(RFC 7636)所需的 S256 code_challenge。

code_challenge (S256)

完全在浏览器中运行。输入内容不会被发送或保存。

使用方法

  1. 点击生成得到新的 code_verifier,或粘贴已有的。
  2. code_challenge 按 BASE64URL(SHA-256(code_verifier)) 计算。
  3. 在授权请求中发送 code_challenge 和 code_challenge_method=S256。
  4. 在令牌请求中发送 code_verifier。

PKCE(Proof Key for Code Exchange,RFC 7636)用于保护 OAuth 2.0 授权码流程,专为无法保存客户端密钥的移动应用、桌面应用和单页应用等公共客户端设计。客户端在跳转授权页之前生成一次性的秘密值 code_verifier,只发送它的哈希值 code_challenge。之后用授权码换取令牌时再发送原始 verifier,服务器核对两者是否匹配,只截获授权码换不到令牌。

本工具用 crypto.getRandomValues 生成 32 字节随机数,编码为无填充 base64url,因此 verifier 为 43 个字符。code_challenge 是 verifier 的 SHA-256 再按同样方式编码,始终为 43 个字符。RFC 7636 也定义了 plain,但规定能计算 SHA-256 的客户端必须使用 S256,所以这里只提供 S256。适合调试登录对接或手动构造测试请求。

粘贴的 verifier 会直接计算哈希,不做格式校验,请自行确认它是 43–128 个字符,且只包含 A-Z、a-z、0-9、-、.、_、~。每次授权请求都应生成新的 verifier。两个值都在浏览器内计算,不会发送到任何地方。

常见问题

什么是 PKCE?

Proof Key for Code Exchange(RFC 7636)。授权请求发送哈希后的 code_challenge,令牌请求发送原始 code_verifier,因此仅窃取授权码无法换取令牌。

code_challenge 如何计算?

S256 方式:对 ASCII 的 code_verifier 做 SHA-256,再进行不带填充的 base64url 编码。RFC 7636 示例 dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk 的结果是 E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM。

为什么生成的 verifier 是 43 个字符?

32 字节随机数做不带填充的 base64url 编码正好 43 个字符,这是 RFC 7636 允许的最短长度(由 A-Z、a-z、0-9、-、.、_、~ 组成,43–128 个字符)。

相关工具