Java JMeter的JSON web令牌生成器
我试图将API调用返回的JWT值与JMeter中的预期有效值进行比较。为此,我需要在预处理器(BSF预处理器或Bean shell预处理器)中生成预期值,然后将其与从调用响应值中提取的值进行比较。 以前有人创造过类似的东西吗?Java JMeter的JSON web令牌生成器,java,json,jmeter,jwt,beanshell,Java,Json,Jmeter,Jwt,Beanshell,我试图将API调用返回的JWT值与JMeter中的预期有效值进行比较。为此,我需要在预处理器(BSF预处理器或Bean shell预处理器)中生成预期值,然后将其与从调用响应值中提取的值进行比较。 以前有人创造过类似的东西吗? 我目前使用手动生成预期值,但希望在JMeter中动态生成这些值。不幸的是,目前没有现成的解决方案来处理JMeter中的JWT签名请求 看起来您至少有以下选项: 尝试使用JMeter而不是JMeter。Gatling已经为这个有效负载实现了扩展——但似乎它目前只支持GET请
我目前使用手动生成预期值,但希望在JMeter中动态生成这些值。不幸的是,目前没有现成的解决方案来处理JMeter中的JWT签名请求 看起来您至少有以下选项:
但它可能看起来相当复杂,需要一些开发经验,而且不容易出错——不准确的实现可能会导致性能下降并影响测试结果
当我遇到同样的问题时,我的第一个非常成功的方法就是使用前置和后置处理器。
需要注意的几点:
- 出于性能原因,使用JSR233(和)+Groovy而不是Beanshell(有关详细信息,您可以查看)李>
- 从中选择JWT的任何稳定java实现
我已经使用过,并且发现它足够好,而且使用起来很简单李> - 在预处理器中执行请求体JWT签名,将签名体存储到变量中,与HTTP请求一起作为体数据发送,在后处理器中对响应进行解码;
HTTP Request // your http call
Body Data = ${jwtSignedBody} // variable with request body already signed in pre-processor
JSR233 PreProcessor // sign here your body data and put into variable
JSR233 PostProcessor // decode JWT-signed response
HTTP请求//您的HTTP调用
Body Data=${jwtSignedBody}//请求主体已在预处理器中签名的变量
JSR233预处理器//在这里签名您的身体数据并放入变量
JSR233后处理器//解码JWT签名响应
- 对于调试和进一步处理来说,使用解码响应在后处理器响应体中进行更新可能非常有用,如上面的脚本所示
您可以使用BeanShell预处理器在HTTP请求采样器之前计算JWT承载令牌 以下是可以生成用于HTTP请求的JWT承载令牌的脚本:
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
String jwtIssuer = "your-issuer-here";
String signingKey = "your-signing-key-here";
String subject = "your-subject-here";
// Additional parts of payload here if you like
String groups = "[]";
//The JWT signature algorithm we will be using to sign the token
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
JwtBuilder builder = Jwts.builder()
.setPayload("{\n" +
" \"iss\": \"" + jwtIssuer + "\",\n" +
" \"iat\": " + new Date(System.currentTimeMillis()).getTime() / 1000 + ",\n" +
" \"sub\": \"" + username + "\",\n" +
" \"groups\": " + groups + "\n" +
"}")
.setHeaderParam("typ", "JWT")
.signWith(signatureAlgorithm, signingKey.getBytes());
vars.put("bearerToken", builder.compact());
显然,对主题
进行硬编码并不太有价值,因为否则您可以在http请求中对承载令牌进行硬编码。因此,您可以使用vars.get
获取jmeter变量。在本例中,我从“CSV数据集配置”加载主题,然后设置String subject=vars.get(“subject”)代码>
现在,您可以在HTTP请求采样器上创建HTTP标头管理器,以添加承载令牌:
<HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true">
<collectionProp name="HeaderManager.headers">
<elementProp name="" elementType="Header">
<stringProp name="Header.name">Authorization</stringProp>
<stringProp name="Header.value">Bearer ${bearerToken}</stringProp>
</elementProp>
</collectionProp>
</HeaderManager>
授权
持票人${bearerToken}
运行测试,您应该会看到您的承载令牌存在,并且您的请求已通过身份验证
我正在尝试第三种方法,出现了“无法解析com.google.gson.JsonObject类”错误。你知道如何解析这个类吗?所以我设法获得了gsonjar文件。现在我得到以下异常:javax.script.ScriptException:java.lang.NullPointerException:org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:320)~[groovy-all-2.4.13.jar:2.4.13]上的null对象无法调用方法setSuccessful()(GroovyCompiledScript.java:72)~[groovy-all-2.4.13.jar:2.4.13]在javax.script.CompiledScript.eval(CompiledScript.java:92)~[?:1.8.0¡]…嗯……实际的异常是javax.script.ScriptException:groovy.lang.MissingPropertyException:没有这样的属性:类:Script8的Jwts