JMeter中OAuth PKCE流问题:无法提取参数且脚本执行报错
解决JMeter PKCE流程生成code_verifier/code_challenge时的空指针错误
错误根源
这个NullPointerException说白了就是code_verifier变量是null,导致后续调用getBytes()方法时直接报错。大概率是生成code_verifier的代码逻辑有问题,比如随机字符串生成失败、变量没初始化就拿来用了。
修复步骤
1. 重新生成可靠的code_verifier
把原来生成code_verifier的代码换成下面这段,保证生成符合PKCE规范的随机字符串(长度43-128位,只包含a-z、A-Z、0-9、-、_、~、.):
import java.security.SecureRandom import java.util.Base64 def secureRandom = new SecureRandom() def bytes = new byte[32] secureRandom.nextBytes(bytes) def codeVerifier = Base64.getUrlEncoder().withoutPadding().encodeToString(bytes) vars.put("code_verifier", codeVerifier)
这段代码会生成合规的code_verifier,并存到JMeter变量code_verifier里。
2. 加个判断避免空指针
在生成code_challenge之前,先检查code_verifier是否存在,别上来就调用方法:
def codeVerifier = vars.get("code_verifier") if (!codeVerifier) { log.error("code_verifier没生成,没法生成code_challenge") return } // 生成code_challenge的逻辑 import java.security.MessageDigest import java.util.Base64 def md = MessageDigest.getInstance("SHA-256") def digest = md.digest(codeVerifier.getBytes("UTF-8")) def codeChallenge = Base64.getUrlEncoder().withoutPadding().encodeToString(digest) vars.put("code_challenge", codeChallenge)
3. 检查脚本配置细节
- 一定要选Groovy语言作为JSR223脚本的语言,Groovy比其他语言稳定,性能也更好
- 别勾选
Cache compiled script if available,如果改了代码,缓存会让旧代码继续执行,容易出问题 - 脚本所在的PreProcessor要放在需要用code_verifier/code_challenge的请求前面,顺序错了变量肯定拿不到
4. 加日志调试
要是还解决不了,就在脚本里加个日志输出,看看变量到底有没有生成:
log.info("生成的code_verifier:" + vars.get("code_verifier"))
点JMeter右上角的黄色感叹号打开日志,就能看到输出,确认变量值是否正常。
额外提醒
- PKCE要求code_verifier长度必须在43-128字符之间,上面的代码生成的是43位左右的字符串,完全符合要求
- 确保你的JMeter用的是JDK 8及以上版本,不然
Base64类可能用不了
内容的提问来源于stack exchange,提问作者user20530928
相关产品推荐
相关产品推荐

