我正在尝试比较API调用返回的JWT值和JMeter中预期的有效值。为此,我需要在预处理器中生成预期值(可以使用BSF预处理器或Bean shell预处理器),然后将其与从调用响应值提取的值进行比较。
有人之前创建过类似的东西吗?
我目前使用http://jwt.io/手动生成预期值,但希望在JMeter中动态生成这些值。
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- 对于调试和进一步处理,更新PostProcessor响应正文以包含像上面脚本中解码的响应可能非常有用。
您可以使用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());
显然,硬编码subject
并不太有价值,否则您可以在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>