Java基于jjwt操作jwt

之前讲解了jwt的相关知识,有不了解的,可以查看相关的文章JWT简介-CSDN博客,本节不再介绍,主要讲解有关java中如何通过jjwt库产生jwt以及解析jwt的相关操作。

添加maven依赖

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.12.6</version>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.12.6</version><scope>runtime</scope>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred --><version>0.12.6</version><scope>runtime</scope>
</dependency>

请注意,上述 JJWT 依赖关系声明只有一个编译时依赖关系,其余的都声明为运行时依赖关系。这是因为 JJWT 的设计使您只依赖于经过明确设计的 API,供您在应用程序中使用,而所有其他内部实现细节(可能会在没有警告的情况下发生变化)都被归类为仅在运行时依赖。如果您想确保长期稳定地使用和升级 JJWT,这一点极为重要。

这样做的目的是为了让您受益:jjwt-api .jar 经过精心设计,确保它包含您所需的内容,并尽可能保持向后兼容,这样您就可以在编译范围内安全地依赖它。运行时 jjwt-impl .jar 策略为 JJWT 开发人员提供了随时随地更改内部软件包和实现的灵活性。这有助于我们更快、更高效地实现功能、修复错误并向您发送新版本。

创建JWT

String jwtToken = Jwts.builder().claim("name", "Jane Doe").claim("email", "jane@example.com").subject("jane").id(UUID.randomUUID().toString()).issuedAt(Date.from(now())).expiration(Date.from(now().plus(5L, ChronoUnit.MINUTES))).compact();log.info("jwt is: {}", jwtToken);

产生的token如下:

eyJhbGciOiJub25lIn0.eyJuYW1lIjoiSmFuZSBEb2UiLCJlbWFpbCI6ImphbmVAZXhhbXBsZS5jb20iLCJzdWIiOiJqYW5lIiwianRpIjoiYjNkYzYzM2UtZjFhZi00YzhhLWEwNTAtMGQzZDRkNGFmYmE4IiwiaWF0IjoxNzE5NTI4NzA4LCJleHAiOjE3MTk1MjkwMDh9.

上述生成 JWT 的代码不言自明,但让我们一步步检查如何生成 JWT 标记:

  • 添加声明人姓名和电子邮件,值分别为 Jane Doe 和 jane@example.com
  • 在 JWT 标记中添加主题,值为 jane
  • 使用随机生成的 UUID 为 JWT 令牌设置 ID
  • 将发布时间设置为当前时间
  • 将过期时间设置为当前时间加 5 分钟。因此,JWT 的有效期只有 5 分钟
  • 如果需要添加自定义的属性值,可以通过claim方法进行添加

可使用地址:JSON Web Tokens - jwt.io 对产生的jwt进行解析,如下图所示:

上面生成的 JWT 没有签名(检查标头中的 alg 属性)。我们只是以 JSON 格式对声明进行了编码。如果使用 JWT 进行身份验证或授权,建议签署 JWT,以便对其进行验证。

 验证和解析JWT

要验证或解析 JWT 标记,需要使用 Jwts.parser() 方法。

Jwts.parser().unsecured().build().parseUnsecuredClaims(jwtToken);

解析未签名的jwt时,需要使用unsecured()方法,对于签名的jwt,后续介绍。

在解析 JWT 令牌时,我们需要通过签名密钥来验证 JWT 签名。让我们看看如何使用不同的算法签署 JWT 令牌。

创建并验证使用 HMAC Secret 签名的 JWT 令牌

创建签名 JWT 标记的最简单方法是使用 HMAC 密钥。HMAC 代表基于散列的消息验证码,是一种加密散列函数。它用于同时验证令牌的数据完整性和真实性。

创建用 HMAC 签名的 JWT 令牌

要创建使用 HMAC 共享秘密签名的 JWT 标记,我们需要使用 .signWith() 方法指定签名。

// Key is hardcoded here for simplicity. 
// Ideally this will get loaded from env configuration/secret vault
String secret = "asdfSFS34wfsdfsdfSDSD32dfsddDDerQSNCK34SOWEK5354fdgdf4";
SecretKey  key = Keys.hmacShaKeyFor(Decoders.BASE64.decode(secret));Instant now = Instant.now();String jwtToken = Jwts.builder().claim("name", "Jane Doe").claim("email", "jane@example.com").subject("jane").id(UUID.randomUUID().toString()).issuedAt(Date.from(now)).expiration(Date.from(now.plus(5L, ChronoUnit.MINUTES))).signWith(key).compact();

生成的 JWT 令牌:

eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiSmFuZSBEb2UiLCJlbWFpbCI6ImphbmVAZXhhbXBsZS5jb20iLCJzdWIiOiJqYW5lIiwianRpIjoiMGMxZDgzMGEtZjU5NC00MTQwLWI1YWMtYjE0ZTk2MTMyNDBkIiwiaWF0IjoxNzE5NTI5NTg2LCJleHAiOjE3MTk1Mjk4ODZ9.53vnen3J2qFVpbIGDhzvuXOySJX_zesTZuVYe9zM8JM

 

在header中的alg表明,签名使用的时HS-256算法。 

验证/解析用 HMAC 签名的 JWT 令牌

要验证/解析使用 HMAC 共享密钥生成的 JWT 令牌,也可以采用相同的步骤。在解析 JWT 令牌之前,我们需要使用 verifyWith() 方法设置密钥。

final Jws<Claims> claimsJws = Jwts.parser().verifyWith(key).build().parseSignedClaims(jwtToken);log.info("info is: {}", claimsJws);

如果 JWT 令牌过期(过期声明值小于当前系统时间),parseClaimsJws() 方法将抛出 SignatureException。

 如果报出该错误 ,则说明jwt过期,需要返回401或者重定向到登录页。

以上是对于jjwt操作jwt的简单使用,基本可以适用于大部分应用常见,希望对您有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目标检测之YoloV1

一、预测阶段&#xff08;前向推断&#xff09; 在预测阶段Yolo就相当于一个黑箱子&#xff0c;输入的是448*448*3的图像&#xff0c;输出是7*7*30的张量&#xff0c;包含了所有预测框的坐标、置信度和类别 为什么是7*7*30呢&#xff1f; --将输入图像划分成s*s个grid cell&a…

【多线程】如何解决线程安全问题?

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. synchronized 关键字1.1 锁是什么1.2 如何加锁1.3 synchronized 修饰方法1) 修饰普通成员方法2) 修饰静态…

【系统架构设计师】七、信息安全技术基础知识(访问控制技术|抗攻击技术|计算机系统安全保护能力等级)

目录 一、访问控制技术 二、信息安全的抗攻击技术 2.1 分布式拒绝服务DDoS与防御 2.3 ARP欺骗攻击与防御 2.4 DNS欺骗与防御 2.5 IP欺骗与防御 2.6 端口扫描&#xff08;Port Scanning&#xff09; 2.7 强化TCP/IP堆栈以抵御拒绝服务攻击 2.8 系统漏洞扫描 三、信息安…

基于weixin小程序乡村旅游系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商家管理&#xff0c;旅游景点管理&#xff0c;景点类型管理&#xff0c;景点路线管理&#xff0c;系统管理 商家帐号账号功能包括&#xff1a;系统首页&#xff0c;旅游景点管理&…

解决RuntimeError: Unsupported image type, must be 8bit gray or RGB image.

今天在使用Opencv进行人脸识别项目时发现了一个问题&#xff0c;一直报这个错误RuntimeError: Unsupported image type, must be 8bit gray or RGB image.查了一下资料也是解决了&#xff0c;这样给大家分享一下 解决方案 Numpy 有一个主要版本更新&#xff0c;与 dlib 不兼容。…

【Docker】创建 swarm 集群

目录 1. 更改防火墙设置 2. 安装 Docker 组件 3. 启动 Docker 服务&#xff0c;并检查服务状态。 4. 修改配置文件&#xff0c;监听同一端口号。 5. 下载 Swarm 组件 6. 创建集群&#xff0c;加入节点 7. 启动集群 8. 查询集群节点信息 9. 查询集群具体信息 10. 查询…

电脑文件concrt140.dll丢失要怎么恢复?靠谱修复方法分析

电脑文件concrt140.dll丢失这种情况&#xff0c;相对来说还是比较少见的&#xff01;但是不代表没有&#xff0c;既然有人出现这种情况了&#xff0c;那么小编势必要给大家详细的讲解一下concrt140.dll这个文件&#xff0c;以及我们要怎么去解决concrt140.dll文件丢失的问题。下…

hnust 1817 算法10-10,10-11:堆排序

hnust 1817 算法10-10,10-11&#xff1a;堆排序 题目描述 堆排序是一种利用堆结构进行排序的方法&#xff0c;它只需要一个记录大小的辅助空间&#xff0c;每个待排序的记录仅需要占用一个存储空间。 首先建立小根堆或大根堆&#xff0c;然后通过利用堆的性质即堆顶的元素是最…

pppd 返回错误码 含义

错误码 00&#xff1a; pppd已经断开&#xff0c;或者已经成功建立连接后请求方又中 断了。 01&#xff1a; 发成了一个严重错误&#xff0c;例如系统调用失败或者访问非法内存。 02&#xff1a; 处理给定操作是检测到错误&#xff0c;例如使用两个互斥的操作。 03&#xff1a;…

如何获取Power BI的个性可视化控件?

我们在使用Power BI Desktop自带可视化控件进行报表设计的时候&#xff0c;有的时候会发现自带控件使用起来略显单薄&#xff0c;需要一些更有创意或者更能直接吸人眼球的可视化控件。 那有没有地方可以让我们找到一些个性化控件呢&#xff1f; 答案是肯定的&#xff0c;目前P…

vscode 安装Vue插件

打开扩展面板 --> 点击左侧的扩展图标&#xff0c;或者按下快捷键 Ctrl Shift X 搜索插件,在搜索框中输入 Vue vue-helper 用来快捷提示&#xff0c;如果使用elementui的话&#xff0c;插件不会自动提示&#xff0c;安装了它&#xff0c;组件、属性都会有提示了 Vetur V…

嵌入式Linux系统编程 — 4.1 字符串输入输出

目录 1 字符串输出 1.1 字符串输出函数简介 1.2 示例程序 2 字符串输入 2.1 字符串输入简介 2.2 示例程序 程序运行时&#xff0c;需打印信息至标准输出 stdout 设备 或标准错误 stderr设备&#xff08;譬如屏幕&#xff09;&#xff0c;如调试信息、报错信息、中间产生的…

Java | Leetcode Java题解之第202题快乐数

题目&#xff1a; 题解&#xff1a; class Solution {private static Set<Integer> cycleMembers new HashSet<>(Arrays.asList(4, 16, 37, 58, 89, 145, 42, 20));public int getNext(int n) {int totalSum 0;while (n > 0) {int d n % 10;n n / 10;totalS…

枫清科技创始人高雪峰:不取侥幸之利,做难而正确的事!丨数据猿专访

大数据产业创新服务媒体 ——聚焦数据 改变商业 金庸有一本著作叫做《侠客行》&#xff0c;这部武侠小说的主角叫做石破天&#xff0c;他从小的时候便跟随少林弟子习武。长大后&#xff0c;随着自己获得的感悟越来越多&#xff0c;最终选择开宗立派&#xff0c;独创一门武功行…

碧海威L7云路由无线运营版 confirm.php/jumper.php 命令注入漏洞复现(XVE-2024-15716)

0x01 产品简介 碧海威L7网络设备是 北京智慧云巅科技有限公司下的产品,基于国产化ARM硬件平台,采用软硬一体协同设计方案,释放出产品最大效能,具有高性能,高扩展,产品性能强劲,具备万兆吞吐能力,支持上万用户同时在线等高性能。其采用简单清晰的可视化WEB管理界面,支持…

【ONLYOFFICE 8.1】的安装与使用——功能全面的 PDF 编辑器、幻灯片版式、优化电子表格的协作

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、ONLYOFFICE 简介三、安装1. Windows/Mac 安装2. 文档开发者版安装安装前准备使用 Docker 安装使用 Linux 发行版安装配置 ONLYOFFICE 文档开发者版集成和开发 四、使用1. 功能全面的 PDF 编辑器PDF 查看和导航P…

交易例子----qmt实盘分钟交易例子,提供交易源代码

今天给大家一个利用qmt_trader交易策略&#xff0c;我现在实盘使用的系统是自己开发的&#xff0c;只需要把qmt_trader当中第三方库使用就可以&#xff0c;源代码开源开源直接下载 量化系统--开源强大的qmt交易系统&#xff0c;提供源代码 参考教程使用&#xff0c;下载当第三…

ONLYOFFICE桌面编辑器8.1版:个性化编辑和功能强化的全面升级

ONLYOFFICE是一款全面的办公套件&#xff0c;由Ascensio System SIA开发。该软件提供了一系列与微软Office系列产品相似的办公工具&#xff0c;包括处理文档&#xff08;ONLYOFFICE Document Editor&#xff09;、电子表格&#xff08;ONLYOFFICE Spreadsheet Editor&#xff0…

Ubuntu Nvidia GPU驱动安装和故障排除

去官网 菜单列表下载&#xff0c;或者直接下载驱动 wget https://cn.download.nvidia.com/XFree86/Linux-x86_64/550.54.14/NVIDIA-Linux-x86_64-550.54.14.run 安装驱动 /data/install/NVIDIA-Linux-x86_64-550.54.14.run 执行命令&#xff0c;显示GPU情况 出错处理&…

【深度学习】tensorboard的使用

目前正在写一个训练框架&#xff0c;需要有以下几个功能&#xff1a; 1.保存模型 2.断点继续训练 3.加载模型 4.tensorboard 查询训练记录的功能 命令&#xff1a; tensorboard --logdirruns --host192.168.112.5 效果&#xff1a; import torch import torch.nn as nn impor…