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,一经查实,立即删除!

相关文章

sam_out 目标检测的应用

缺点参考地址训练验证模型解析 缺点 词表太大量化才可 参考地址 https://aistudio.baidu.com/projectdetail/8103098 训练验证 import os from glob import glob import cv2 import paddle import faiss from out_yolo_model import GPT as GPT13 import pandas as pd imp…

目标检测之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) 修饰静态…

LeetCode //Bash - 192. Word Frequency

192. Word Frequency Write a bash script to calculate the frequency of each word in a text file words.txt. For simplicity sake, you may assume: words.txt contains only lowercase characters and space ’ ’ characters.Each word must consist of lowercase ch…

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

目录 一、访问控制技术 二、信息安全的抗攻击技术 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;旅游景点管理&…

ArchLinux挑战安装(ZFS、Wayland、KDE、xero)

目录 0. 前言&#xff1a; 1. 先期准备 1.1 引导ArchLinx光盘。 1.2 禁用 reflector 服务 1.3 防止网卡禁用 1.4 wifi设置 1.5 测试网络是否连接 1.6 更新系统时间 1.7 更换源 1.8 下载ZFS模块 1.9 加载ZFS模块 2. 磁盘处理 2.1 查看磁盘分区 2.2 清除与整个磁盘…

HTML5与HTML:不仅仅是标签的革新

当我们提到HTML5&#xff0c;很多人会想到这是HTML的一个升级版本&#xff0c;增加了许多新的标签和特性。然而&#xff0c;HTML5带来的变化远不止于此。它是一个全面的网页开发框架&#xff0c;重新定义了网络应用程序的构建方式&#xff0c;为开发者提供了前所未有的灵活性和…

【数组】- 最小覆盖子串

1. 对应力扣题目连接 最小覆盖子串 2. 实现案例代码 public class MinimumCoveringSubstring {public static void main(String[] args) {System.out.println(minWindow("ADOBECODEBANC", "ABC")); // 输出&#xff1a;"BANC"System.out.prin…

解决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;然后通过利用堆的性质即堆顶的元素是最…

【算法篇】查找字符串数组中的最长公共前缀

问题描述: 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”“”。 示例 1: 输入: [“flower”,“flow”,“flight”] 输出: “fl” 示例 2: 输入: [“dog”,“racecar”,“car”] 输出: “” 解题 为了解决这个问题,我们可以遍历…

pppd 返回错误码 含义

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

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

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

每日一道算法题 括号的最大嵌套深度

题目 1614. 括号的最大嵌套深度 - 力扣&#xff08;LeetCode&#xff09; Python class Solution:def maxDepth(self, s: str) -> int:count0maxCount0for i in s:if i(:count1if i):maxCountmax(maxCount,count)count-1return maxCountC class Solution { public:int m…

vscode 安装Vue插件

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

Ionic 滑动框

Ionic 滑动框 Ionic 是一个强大的开源框架,用于构建高性能、高质量的移动端和网页应用程序。它以其美观的设计和丰富的组件库而闻名,其中包括滑动框(Slide Box)。滑动框是一个多功能的组件,允许用户通过滑动来浏览图片、文本或其他内容。在本篇文章中,我们将深入探讨Ion…

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

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