JSON JMeter 的网络令牌生成器

JSON web token generator for JMeter

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

遗憾的是,目前没有用于在 JMeter 中处理 JWT 签名请求的现成解决方案。

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

  1. 尝试使用gatling instead of JMeter. Gatling has already implemented extension for this payload - gatling-jwt - 但目前似乎只支持GET请求。

  2. 可能您可以尝试扩展标准 HTTP 请求采样器或自定义 REST Sampler with JWT signing using any java implementation of JWT - like it's done in OAuth Sampler 插件以用于 OAuth 负载。
    但它可能看起来相当复杂,需要一些开发经验,并且不容易出错 - 不准确的实现可能会导致性能下降并影响您的测试结果。

  3. 您在问题中提到的使用预处理器和 Post 处理器进行 JWT 签名和响应验证的方法似乎是合理的妥协。
    当我遇到同样的问题时,我的第一个也是非常成功的方法也使用了预处理器和Post处理器。
    几点注意:

    • 使用 JSR233(两者都 PreProcessor and PostProcessor) + Groovy instead of Beanshell for performance reasons (for details you can look into this article);
    • select 来自 list of available 的任何稳定的 java JWT 实现;
      我用过 jjwt 并且发现它足够好并且易于使用;
    • 在 PreProcessor 中执行请求主体 JWT 签名,将签名的主体存储到变量中,将其作为主体数据与 HTTP 请求一起发送,并在 PostProcessor 中解码响应;
      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
      
    • 它可能对调试和进一步处理非常有用,以在 Post 处理器响应正文中更新,如上面的脚本中那样具有解码响应。

您可以使用 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 Header 管理器来添加不记名令牌:

          <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>

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

JMeter 没有直接的 JWT 处理能力。但是我们可以为此目的编写一个自定义的 JMeter 扩展。 我们可以使用通用的 JWT 令牌处理库来实现。

我为我的测试要求做了一个这样的实现。您可以在 Github 上访问该代码并获得一个想法。 https://github.com/gvasanka/jwt-builder-jmeter-ext