JMeter中生成Code Verifier与Code Challenge遇问题,求修复
JMeter生成Code Verifier和Code Challenge修复方案
一、可直接运行的Groovy代码(JSR223元件中使用)
import java.security.SecureRandom import java.util.Base64 import java.security.MessageDigest // 生成符合RFC 7636规范的Code Verifier def secureRandom = new SecureRandom() byte[] verifierBytes = new byte[32] secureRandom.nextBytes(verifierBytes) def codeVerifier = Base64.getUrlEncoder().withoutPadding().encodeToString(verifierBytes) // 生成SHA-256类型的Code Challenge MessageDigest digest = MessageDigest.getInstance("SHA-256") byte[] challengeBytes = digest.digest(codeVerifier.getBytes("UTF-8")) def codeChallenge = Base64.getUrlEncoder().withoutPadding().encodeToString(challengeBytes) // 存入JMeter变量,供后续HTTP请求调用 vars.put("code_verifier", codeVerifier) vars.put("code_challenge", codeChallenge)
二、原代码常见问题及修复点
- 语言选择错误:别用BeanShell,JMeter推荐JSR223元件+Groovy语言,对Java新API支持更好,性能也更高
- Base64编码不符合规范:必须用无填充的URL安全Base64(
withoutPadding()),RFC 7636明确禁止=填充符 - 变量未正确存储:一定要用
vars.put()把生成的字符串存入JMeter上下文,否则后续HTTP请求拿不到值 - 哈希算法错误:Code Challenge必须用SHA-256(即S256方法),这是OAuth 2.0 PKCE流程的标准要求
三、使用步骤
- 在需要调用变量的HTTP请求前面,添加「JSR223 PreProcessor」(比Sampler更适合前置生成变量)
- 把上述代码粘贴到PreProcessor的「Script」输入框,确保语言选择为Groovy
- 在HTTP请求的参数、请求头或请求体中,用
${code_verifier}和${code_challenge}直接引用变量 - 可添加「Debug Sampler」查看变量是否生成成功,验证值的格式是否符合要求
内容的提问来源于stack exchange,提问作者Hemlata Nayak
相关产品推荐
相关产品推荐

