Java JMeter的JSON web令牌生成器

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请

我试图将API调用返回的JWT值与JMeter中的预期有效值进行比较。为此,我需要在预处理器(BSF预处理器或Bean shell预处理器)中生成预期值,然后将其与从调用响应值中提取的值进行比较。 以前有人创造过类似的东西吗?
我目前使用手动生成预期值,但希望在JMeter中动态生成这些值。

不幸的是,目前没有现成的解决方案来处理JMeter中的JWT签名请求

看起来您至少有以下选项:

  • 尝试使用JMeter而不是JMeter。Gatling已经为这个有效负载实现了扩展——但似乎它目前只支持GET请求

  • 可能您可以尝试使用any扩展标准HTTP请求采样器或自定义JWT签名,就像OAuth负载插件中所做的那样。
    但它可能看起来相当复杂,需要一些开发经验,而且不容易出错——不准确的实现可能会导致性能下降并影响测试结果

  • 您在问题中提到的使用前后处理器进行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