如何使用JMeter 5.4.1生成OAuth 2.0的authorization与access令牌
JMeter 5.4.1 生成OAuth 2.0令牌的可行方案
以下两种方案均兼容JMeter 5.4.1版本,无需依赖已废弃的OAuth Sampler插件即可实现OAuth 2.0令牌生成:
方案1:使用内置HTTP请求组件(最推荐,无额外依赖)
- 先根据你使用的OAuth 2.0授权类型(授权码模式/客户端模式/密码模式等)构造对应授权请求:
若使用授权码模式,先发送GET请求到授权服务的授权端点,携带client_id、redirect_uri、response_type=code、scope等必填参数,请求成功后从返回内容或重定向地址中提取authorization code。
若使用客户端模式/密码模式,可跳过获取code的步骤,直接构造令牌请求。 - 构造POST请求到授权服务的令牌端点,请求头设置
Content-Type: application/x-www-form-urlencoded,请求体根据授权类型携带对应参数:
授权码模式需携带grant_type=authorization_code、code(上一步提取的授权码)、client_id、client_secret、redirect_uri;
客户端模式需携带grant_type=client_credentials、client_id、client_secret、scope;
密码模式需携带grant_type=password、username、password、client_id、client_secret。 - 使用JMeter内置的JSON提取器或正则表达式提取器,从令牌接口的返回结果中提取
access_token、refresh_token、expires_in等字段,存入JMeter变量后即可在后续业务接口中直接引用。
提示:如果授权接口有防爬、验证码等校验,可提前配置好Cookie管理器、Header管理器处理身份上下文。
方案2:使用JSR223组件自定义实现(适合有特殊加密/签名要求的场景)
如果你的OAuth 2.0流程有自定义签名、参数加密等特殊要求,可以用Groovy脚本手动实现令牌生成逻辑:
- 新增JSR223 PreProcessor或JSR223 Sampler,脚本语言选择Groovy(JMeter 5.4.1已内置Groovy支持,无需额外安装插件)
- 按照你的OAuth 2.0规范拼接参数、生成签名后发送请求,参考脚本如下:
import groovy.json.JsonSlurper import java.net.URLEncoder // 配置基础参数 def tokenEndpoint = "你的令牌端点地址" def clientId = "你的客户端ID" def clientSecret = "你的客户端密钥" def grantType = "client_credentials" def scope = "你申请的权限范围" // 构造请求参数 def params = [ client_id: clientId, client_secret: clientSecret, grant_type: grantType, scope: scope ] // 发送POST请求获取令牌 def post = new URL(tokenEndpoint).openConnection() post.setRequestMethod("POST") post.setDoOutput(true) post.setRequestProperty("Content-Type", "application/x-www-form-urlencoded") def out = new OutputStreamWriter(post.getOutputStream()) out.write(params.collect { k, v -> "${k}=${URLEncoder.encode(v, 'UTF-8')}" }.join("&")) out.flush() out.close() // 解析返回结果并将令牌存入JMeter变量 if (post.getResponseCode() == 200) { def tokenResp = new JsonSlurper().parse(post.getInputStream()) vars.put("access_token", tokenResp.access_token as String) vars.put("expires_in", tokenResp.expires_in as String) }
提示:脚本中的敏感信息(比如client_secret、账号密码)建议通过JMeter属性、用户定义变量等方式配置,不要硬编码在脚本中,避免信息泄露。
内容的提问来源于stack exchange,提问作者Anurag Agrawal
相关产品推荐
相关产品推荐

