如何提取OAuth2的code与code verifier以传入Token API负载
在JMeter中实现OAuth2 PKCE流程的动态参数生成
1. 先搞懂核心参数逻辑
这是OAuth2的PKCE授权码流程,后端提到的Keytool是服务端用于密钥管理的工具,客户端侧完全不需要依赖它,自己就能生成两个关键参数:
- code_verifier:43-128位的随机高熵字符串,仅允许包含
a-zA-Z0-9~-_ .字符 - code_challenge:将code_verifier做SHA-256哈希运算后,转成不带填充的Base64URL编码字符串
2. 生成code_verifier(用Groovy脚本)
在JMeter中添加一个JSR223 PreProcessor(或JSR223 Sampler),粘贴以下脚本:
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}即可引用。
3. 生成对应的code_challenge
在生成code_verifier的元件之后,再添加一个JSR223 PreProcessor,用以下脚本生成code_challenge:
import java.security.MessageDigest import java.util.Base64 def codeVerifier = vars.get("code_verifier") 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)
该脚本会自动读取之前生成的code_verifier,计算出对应的code_challenge并存入变量。
4. 获取授权码(code参数)
接下来需要调用授权端点(Authorization Endpoint),请求参数必须包含:
response_type=codeclient_id=你的客户端IDredirect_uri=你配置的回调地址code_challenge=${code_challenge}code_challenge_method=S256(因为我们采用SHA-256哈希算法)- 额外的scope等参数(根据你的应用要求填写)
如果授权流程需要用户登录页面交互,就用JMeter的WebDriver Sampler模拟浏览器操作;如果是后台可直接调用的端点,用HTTP Request Sampler发送请求即可。拿到响应后,用正则表达式提取器把code值提取出来,存入JMeter变量(比如${code})。
5. 调用Token API获取AccessToken
最后在Token API的请求负载中,填入动态参数:
grant_type=authorization_codecode=${code}(刚才提取的授权码)code_verifier=${code_verifier}client_id=你的客户端IDredirect_uri=和授权请求一致的回调地址- 其他必填参数(比如client_secret,若你的应用要求的话)
6. 验证参数正确性
可以添加一个Debug Sampler,运行后查看生成的code_verifier和code_challenge:
- code_verifier长度需在43-128位之间
- code_challenge不能包含Base64的填充符号
=
内容的提问来源于stack exchange,提问作者Swarup
相关产品推荐
相关产品推荐

