JSON JMeter 的网络令牌生成器
JSON web token generator for JMeter
我正在尝试将 API 调用返回的 JWT 值与 JMeter 中的预期有效值进行比较。为此,我需要在预处理器(BSF 预处理器或 Bean shell 预处理器)中生成预期值,然后将其与从调用响应值中提取的值进行比较。
以前有人创造过类似的东西吗?
我目前使用 http://jwt.io/ 手动生成预期值,但想在 JMeter 中动态生成这些值。
遗憾的是,目前没有用于在 JMeter 中处理 JWT 签名请求的现成解决方案。
看起来您至少有以下选项:
尝试使用gatling instead of JMeter. Gatling has already implemented extension for this payload - gatling-jwt - 但目前似乎只支持GET请求。
可能您可以尝试扩展标准 HTTP 请求采样器或自定义 REST Sampler with JWT signing using any java implementation of JWT - like it's done in OAuth Sampler 插件以用于 OAuth 负载。
但它可能看起来相当复杂,需要一些开发经验,并且不容易出错 - 不准确的实现可能会导致性能下降并影响您的测试结果。
您在问题中提到的使用预处理器和 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
我正在尝试将 API 调用返回的 JWT 值与 JMeter 中的预期有效值进行比较。为此,我需要在预处理器(BSF 预处理器或 Bean shell 预处理器)中生成预期值,然后将其与从调用响应值中提取的值进行比较。 以前有人创造过类似的东西吗? 我目前使用 http://jwt.io/ 手动生成预期值,但想在 JMeter 中动态生成这些值。
遗憾的是,目前没有用于在 JMeter 中处理 JWT 签名请求的现成解决方案。
看起来您至少有以下选项:
尝试使用gatling instead of JMeter. Gatling has already implemented extension for this payload - gatling-jwt - 但目前似乎只支持GET请求。
可能您可以尝试扩展标准 HTTP 请求采样器或自定义 REST Sampler with JWT signing using any java implementation of JWT - like it's done in OAuth Sampler 插件以用于 OAuth 负载。
但它可能看起来相当复杂,需要一些开发经验,并且不容易出错 - 不准确的实现可能会导致性能下降并影响您的测试结果。您在问题中提到的使用预处理器和 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