JMeter 的 JSON Web Token 生成器

6
我正在尝试比较API调用返回的JWT值和JMeter中预期的有效值。为此,我需要在预处理器中生成预期值(可以使用BSF预处理器或Bean shell预处理器),然后将其与从调用响应值提取的值进行比较。 有人之前创建过类似的东西吗? 我目前使用http://jwt.io/手动生成预期值,但希望在JMeter中动态生成这些值。
3个回答

2
很遗憾,目前在JMeter中没有现成的解决方案来处理JWT签名请求。
看起来你至少有以下几个选项:
尝试使用gatling而不是JMeter。 Gatling已经实现了这个有效载荷的扩展 - gatling-jwt - 但似乎目前仅支持GET请求。
可能您可以尝试使用任何 Java JWT实现(例如在OAuth负载的 OAuth Sampler插件中所做的那样),扩展标准HTTP请求采样器或自定义 REST Sampler进行JWT签名。
但这可能是一种相当复杂的方法,需要一定的开发经验,并且容易出错 - 不准确的实现可能会导致性能下降并影响您的测试结果。
您在问题中提到的使用JWT签名和响应验证的预处理程序和后处理程序方法似乎是一个合理的折衷方案。
当我遇到同样的问题时,我的第一个且相当成功的方法也是使用预处理程序和后处理程序。
需要注意以下几点:
- 出于性能原因,请使用JSR233(PreProcessorPostProcessor均可)+ Groovy而不是Beanshell(有关详细信息,可以查看此文章)。
- 从可用列表中选择任何稳定的Java JWT实现; 我使用jjwt,发现它足够好且易于使用。
- 在预处理程序中执行请求正文JWT签名,将已签名的正文存储在变量中,在PostProcessor中发送它以及HTTP请求作为Body Data并解码响应;
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响应正文以包含像上面脚本中解码的响应可能非常有用。

我正在尝试第三种方法,但是我遇到了“无法解析类com.google.gson.JsonObject”的错误。您知道如何解决这个类吗? - singh2005
我成功获取了gson jar文件。现在我遇到了以下异常:javax.script.ScriptException: java.lang.NullPointerException: Cannot invoke method setSuccessful() on null object at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:320) ~[groovy-all-2.4.13.jar:2.4.13] at org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:72) ~[groovy-all-2.4.13.jar:2.4.13] at javax.script.CompiledScript.eval(CompiledScript.java:92) ~[?:1.8.0_161] ... - singh2005
嗯...实际的异常是javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: Jwts for class: Script8。 - singh2005

0

您可以使用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>

运行您的测试,您应该看到您的令牌已经存在,并且您的请求已经通过身份验证。

JWT bearer token present in request


0
JMeter没有直接处理JWT的能力。但是我们可以编写一个自定义的JMeter扩展来实现这个目的。 我们可以使用通用的JWT令牌处理库来进行实现。
我为我的测试需求做了一个这样的实现。您可以访问Github上的代码并了解一下。 https://github.com/gvasanka/jwt-builder-jmeter-ext

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接