Jmeter生成JWT token

JWT简介

JWT官网:https://jwt.io/

JSON Web令牌(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑而自包含的方式,用于在各方之间以JSON对象的形式安全地传输信息。此信息可以验证和信任,因为它经过了数字签名。JWT可以使用密钥(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。

JSON Web令牌由三个部分组成,即:Header、Payload、Signature,这三者由两个点(.)分隔开。通常JWT展示为:Header.Payload.Signature。

  • Header

    Header通常包含两个部分:token的类型、签名的算法。如:

    {

    "alg": "HS256",

    "typ": "JWT"

    }

    这部分Header的内容会被Base64Url编码来形成JWT的第一部分。

  • Payload

    Payload包含了声明,声明是关于实体(通常是用户)和其他数据的声明。有三种类型的声明:registered claims, public claims, and private claims。

    • Registered claims是一组预定义的声明,不是强制性的,而是推荐的,以提供一组有用的、可互操作的声明。其中一些是:iss(发行者)、exp(到期时间)、sub(主题)、aud(受众)等。
    • Public Claims:这些声明可以自定义,但需要注意避免与注册声明的名称冲突。
    • Private Claims:这些声明是保留给特定的应用程序使用的,不会与其他应用程序冲突。

    比如一个有效的payload如下:

    {

    "sub": "1234567890",

    "name": "John Doe",

    "admin": true

    }

    Payload将会被以Base64Url编码形成JWT的第二部分。

  • Signature

    Signature由Header经过Base64Url编码部分、payload经过Base64Url编码的部分和密钥组成,在此基础上由Header中指定的算法进行加密得到JWT的第三部分。

    签名用于验证消息在此过程中没有更改,并且,在使用私钥签名的令牌的情况下,它还可以验证JWT的发送者是它所说的人

    例如:如果指定的加密算法为HMACSHA256,第三部分将会这样生成:

    HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),Secret)

    最后,把上面三个部分放到一起就得到了完成的JWT。输出是三个由点(.)分隔的Base64 URL字符串。

通过JSR223 Sampler/BeanSell取样器生成JWT

这里使用的Jmeter的版本是5.6.2,jjwt的版本是0.9.1,jjwt.jar包可以在如下地址下载:
https://nowjava.com/jar/detail/m02767305/jjwt-0.9.1.jar.html

下载后放到jmeter的 lib\ext目录下。

生成token的具体代码如下:

java 复制代码
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;

//设置密钥,用于签名的加密
String SECRET = "123";
byte[] SECRET_KEY = SECRET.getBytes();

SignatureAlgorithm HS256 = SignatureAlgorithm.HS256;  //Header中的加密算法
Date now = new Date(System.currentTimeMillis());

//设置过期时间,单位为毫秒
Date expired = new Date(System.currentTimeMillis() + 3600000L);

//声明,即自定义的负载信息
Map claims = new HashMap();
claims.put("userId","test001");
claims.put("userName","testName");

//生成jwt
String jwt = Jwts.builder() 
            .setClaims(claims)  //设置payload负载信息
            .setIssuedAt(now)   //设置token发行时间
            .setExpiration(expired)  //设置过期时间
            .signWith(HS256, SECRET_KEY)   //签名
            .compact();

log.info("===========jwt:" + jwt);

//解析jwt
jwt_parse = Jwts.parser()
            .setSigningKey(SECRET_KEY)
            .parseClaimsJws(jwt);
claims_parse = jwt_parse.getBody();

log.info("======== jwt_parse: " + jwt_parse);
log.info("======== claims_parse: " + claims_parse);

运行打印结果如下,可以看到Header中,签名的算法即alg为HS256;body就是负载信息,除了在claims中的userName、userId外,还包含了token过期时间以及token发行时间。

shell 复制代码
2024-09-30 08:58:14,165 INFO o.a.j.u.BeanShellTestElement: ===========jwt:eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyTmFtZSI6InRlc3ROYW1lIiwiZXhwIjoxNzI3NjYxNDk0LCJ1c2VySWQiOiJ0ZXN0MDAxIiwiaWF0IjoxNzI3NjU3ODk0fQ.m6ufuqgMYXrnjEutgT5CEhJs7VmVvee9XYIhqJoEhNs
2024-09-30 08:58:14,166 INFO o.a.j.u.BeanShellTestElement: ======== jwt_parse: header={alg=HS256},body={userName=testName, exp=1727661494, userId=test001, iat=1727657894},signature=m6ufuqgMYXrnjEutgT5CEhJs7VmVvee9XYIhqJoEhNs
2024-09-30 08:58:14,166 INFO o.a.j.u.BeanShellTestElement: ======== claims_parse: {userName=testName, exp=1727661494, userId=test001, iat=1727657894}
相关推荐
DanmF--4 分钟前
Protobuf工具
网络·unity·游戏引擎·游戏程序
lqlj223322 分钟前
Spark SQL 读取 CSV 文件,并将数据写入 MySQL 数据库
数据库·sql·spark
遗憾皆是温柔1 小时前
MyBatis—动态 SQL
java·数据库·ide·sql·mybatis
未来之窗软件服务1 小时前
Cacti 未经身份验证SQL注入漏洞
android·数据库·sql·服务器安全
兴达易控1 小时前
ProfibusDP主站转modbusTCP网关接DP从站网关通讯案例
网络
fengye2071612 小时前
在MYSQL中导入cookbook.sql文件
数据库·mysql·adb
Ailovelearning2 小时前
neo4j框架:ubuntu系统中neo4j安装与使用教程
数据库·neo4j
IP管家3 小时前
物联网设备远程管理:基于代理IP的安全固件更新通道方案
服务器·网络·物联网·网络协议·tcp/ip·安全·ip
搬码临时工3 小时前
远程连接电脑的方法?异地远程桌面连接和三方软件实现
运维·服务器·网络·物联网·电脑·远程工作
_星辰大海乀3 小时前
表的设计、聚合函数
java·数据结构·数据库·sql·mysql·数据库开发