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的具体代码如下:

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发行时间。

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}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/887840.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Python] 《人生重开模拟器》游戏实现

文章目录 优化点一:多元化的天赋系统示例天赋:天赋选择代码: 优化点二:更加多样化的随机事件年龄阶段划分:随机事件代码: 优化点三:设定人生目标人生目标示例:人生目标代码&#xff…

python爬虫 - 初识requests模块

🌈个人主页:https://blog.csdn.net/2401_86688088?typeblog 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html 前言 requests 是一个用于发送 HTTP 请求的 Python 库,设计简单且功能强大&am…

如何创建虚拟环境并实现目标检测及验证能否GPU加速

创建虚拟环境: 先创建一个虚拟python环境,敲如下代码 然后再到该虚拟环境里面安装自己想要的包 激活虚拟环境 然后再聚类训练这些 验证GPU加速 阿里源 pip install torch torchvision -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mir…

B树系列解析

我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

YOLO11改进|卷积篇|引入线性可变形卷积LDConv

目录 一、【LDConv】卷积1.1【LDConv】卷积介绍1.2【LDConv】核心代码 二、添加【LDConv】卷积2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【LDConv】卷积 1.1【LDConv】卷积介绍 下图是【LDCNV】的结构图,让我们简单分析…

鸿蒙HarmonyOS开发生态

1、官网 华为开发者联盟-HarmonyOS开发者官网,共建鸿蒙生态 2、开发工具IDE下载及使用 https://developer.huawei.com/consumer/cn/ 3、使用帮助文档 4、发布到华为应用商店 文档中心

多模态大语言模型(MLLM)-Blip2深度解读

前言 Blip2是一个多模态大语言模型,因其提出时间较早(2023年),且效果较好,很快成为一个标杆性工作。Blip2中提出的Q-former也成为衔接多模态和文本的重要桥梁。 Blip2发表时间是2023年,现在引用已经3288了…

事件抽取(Event Extraction, EE)

一、引言 事件抽取(Event Extraction, EE)是信息抽取领域中的一个重要任务,旨在从非结构化文本中识别和抽取事件相关的信息。事件抽取通常包括识别事件触发词、事件类型以及事件中的参与者、时间、地点等元素,最终将这些信息结构…

常见的基础系统

权限管理系统支付系统搜索系统报表系统API网关系统待定。。。 Java 优质开源系统设计项目 来源:Java 优质开源系统设计项目 | JavaGuide 备注:github和gitee上可以搜索到相关项目

【含文档】基于Springboot+Android的房屋租赁App(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

【JavaEE】【多线程】进程与线程的概念

目录 进程系统管理进程系统操作进程进程控制块PCB关键属性cpu对进程的操作进程调度 线程线程与进程线程资源分配线程调度 线程与进程区别线程简单操作代码创建线程查看线程 进程 进程是操作系统对一个正在运行的程序的一种抽象,可以把进程看做程序的一次运行过程&a…

IMS添加实体按键流程 - Android14

IMS添加实体按键流程 - Android14 1、实体按键信息(Mi 9 左侧实体按键)2、硬件添加2.1 内核添加设备节点2.2 Generic.kl映射文件2.3 映射文件文件加载loadKeyMapLocked2.4 addDeviceLocked 添加设备相关对象 3、keycode对应scankode4、KeyEvent.java 添加…

京东云主机怎么用?使用京东云服务器建网站(图文教程)

京东云主机怎么用?非常简单,本文京东云服务器网jdyfwq.com使用以使用京东云服务器搭建WordPress博客网站为例,来详细说下京东云主机的使用方法。使用京东云服务器快速搭建WordPress网站教程,3分钟基于应用镜像一键搞定&#xff0c…

python之详解字符串

由字符组成的序列,可以用单引号或双引号括起来。 1、通过下标获取字符串的字符 1.1、获取单个字符 若要获取字符串中某一个字符,可以通过 字符串名[index] 索引下标的方式获取。 索引的初始值为0,最大值为字符串长度-1。 切记&#xff0…

一、图解C#教程

一、堆和栈 程序运行时,数据存储在内存中。 使用堆和栈来存储数据 1、栈 栈是一个内存数组,先进后出原则。 可以存储:某些类型变量的值;程序当前执行环境;传递给方法的参数; 入栈:把数据放…

自动驾驶-问题笔记-待解决

参考线的平滑方法 参考线平滑算法主要有三种: 离散点平滑;螺旋曲线平滑;多项式平滑; 参考链接:参考线平滑 对于平滑方法,一直不太理解平滑、拟合以及滤波三者的作用与区别; 规划的起点&#x…

计算机网络——email

pop3拉出来 超出ASCII码范围就不让传了 这样就可以传更大的文件

Ubuntu 安装 Docker Compose

安装Docker Compose # 删除现有的 docker-compose(如果存在) sudo rm -f /usr/local/bin/docker-compose ​ # 下载最新的 docker-compose 二进制文件 sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-…

JavaScript for循环语句

for循环 循环语句用于重复执行某个操作,for语句就是循环命令,可以指定循环的起点、终点和终止条件。它的格式如下 for(初始化表达式;条件;迭代因子){语句} for语句后面的括号里面,有三个表达式 初始化表达式(initialize):确定循环变量的初始…

[C语言]指针和数组

目录 1.数组的地址 2.通过指针访问数组 3.数组和指针的不同点 4.指针数组 1.数组的地址 数组的地址是什么&#xff1f; 看下面一组代码 #include <stdio.h> int main() { int arr[5] {5,4,3,2,1}; printf("&arr[0] %p\n", &arr[0]); printf(&qu…