Java基于jjwt操作jwt

news2024/11/26 9:31:15

之前讲解了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.coloradmin.cn/o/1871840.html

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

相关文章

通过ChatGLM的简单例子体验大模型

【图书推荐】《从零开始大模型开发与微调&#xff1a;基于PyTorch与ChatGLM》_《从零开始大模型开发与微调:基于pytorch与chatglm》-CSDN博客 ChatGLM基于GLM架构&#xff0c;针对中文问答和对话进行了优化。经过约1TB标识符的中英双语训练&#xff0c;辅以监督微调、反馈自助…

2734. 执行子串操作后的字典序最小字符串(Rust单百算法)

题目 给你一个仅由小写英文字母组成的字符串 s 。在一步操作中&#xff0c;你可以完成以下行为&#xff1a; 选择 s 的任一非空子字符串&#xff0c;可能是整个字符串&#xff0c;接着将字符串中的每一个字符替换为英文字母表中的前一个字符。例如&#xff0c;‘b’ 用 ‘a’…

DM达梦数据日期时间函数、系统函数整理

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

Python数据分析第二课:conda的基础命令

Python数据分析第二课&#xff1a;conda的基础命令 1.conda是什么? conda是一个开源的包管理系统&#xff0c;可以帮助我们进行管理多个不同版本的软件包&#xff0c;还可以帮助我们建立虚拟环境&#xff0c;以便对不同的项目进行隔离。 简单来说&#xff0c;conda是一个软…

LabVIEW网络开发资源

在LabVIEW开发中&#xff0c;利用网络资源进行学习和查找资料是提高技能和解决问题的重要途径。以下几个国内外优质资源可以帮助开发者获得丰富的技术支持和交流机会&#xff1a; 1. NI Community (NI社区) 简介: National Instruments官方运营的社区&#xff0c;提供丰富的资…

华为od 2024 | 什么是华为od,od 薪资待遇,od机试题清单

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、链表5、栈6、滑动窗口7、二叉树8、并查集9、矩阵 三、算法1、基础算法① 贪心思维② 二分查…

svn切换分支

现在有一个场景&#xff1a; 在svn中有一个b分支&#xff0c;是基于a分支拉出来的&#xff0c;并且我的b分支在本地已经有了改动&#xff0c;a分支在远端也有了改动&#xff0c; 我想把远端a分支的改动同步到我的本地b分支上&#xff0c;如何操作 目前已知的方法 项目右键-&g…

充电站,正在杀死加油站

最近&#xff0c;深圳公布了一组数据&#xff0c;深圳的超级充电站数量已超过传统加油站数量&#xff0c;充电枪数量也已超过加油枪数量。 从全国范围看&#xff0c;加油站关停的速度在加快。 充电站正在杀死加油站。 加油站&#xff0c;未来何去何从&#xff1f; 01. 减少 我…

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

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

spring模块(二)SpringBean(2)InitializingBean

一、介绍 1、简介 InitializingBean是Spring框架提供的一个接口&#xff0c;用于在Bean初始化完成后执行特定的初始化逻辑。 Spring为bean提供了两种初始化bean的方式&#xff0c;实现InitializingBean接口&#xff0c;实现afterPropertiesSet方法&#xff0c;或者在配置文件…

【uml期末复习】统一建模语言大纲

前言&#xff1a; 关于uml的期末复习的常考知识点&#xff0c;可能对你们有帮助&#x1f609; 目录 第一部分 概念与基础 第一章 面向对象技术 第二章 统一软件过程 第三章 UML概述 第四章 用例图 第五章 类图 第六章 对象图 第七章 顺序图 第八章 协作图 第九章 状态…

c++ 子类继承父类

这个是子类继承父类 是否重写从父类那里继承来的函数 这个例子的路径 E盘 demo文件夹 fatherChildfunc

Github 2024-06-28 Java开源项目日报Top9

根据Github Trendings的统计,今日(2024-06-28统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目8非开发语言项目1HTML项目1《Hello 算法》:动画图解、一键运行的数据结构与算法教程 创建周期:476 天协议类型:OtherStar数量:63556…

哈喽GPT-4o,对GPT-4o 数据分析Data Analysis的思考与看法

目录 上传一个Excel给Data Analysis。Prompt&#xff1a;请问这个数据集是做什么的Prompt&#xff1a;请问书籍的定价如何&#xff0c;请用合适的图表展示它的售价情况Prompt&#xff1a;请统计书名列中出现最多的名称&#xff0c;然后使用词云将其可视化。Prompt&#xff1a;请…

湘潭大学软件工程信息与网络安全复习笔记最后一篇

文章目录 复习建议分数占比流密码A5/1RC4 分组密码DESAES 复习建议 现在笔者复习算是收尾了&#xff0c;现在也是考前的最后一天了&#xff0c;走了不少弯路&#xff0c;但是可能也是必不可少的&#xff0c;复习建议是硬着头皮把这份文件看一遍&#xff0c;不理解的地方找英文…

Unity热更方案 YooAsset+HybridCLR,纯c#开发热更,保姆级教程,从零开始

文章预览&#xff1a; 一、前言二、创建空工程三、接入HybridCLR四、接入YooAsset五、搭建本地资源服务器Nginx六、实战七、最后 一、前言 unity热更有很多方案&#xff0c;各种lua热更&#xff0c;ILRuntime等&#xff0c;这里介绍的是YooAssetHybridCLR的热更方案&#xff0…

计网实训——不相同网段的PC相互通信

目录 提前准备APP路由器指令 实验一1、实验需求&#xff08;1&#xff09;实现同网段的PC相互通信。&#xff08;2&#xff09;实现不相同网段的PC相互通信。&#xff08;3&#xff09;分析相同和不同网段PC通信时MAC地址的变化。 2、实验拓扑3、实验步骤及实验截图&#xff08…

【python】PyQt5对象类型的判定,对象删除操作详细解读

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

支付宝小程序唤醒淘宝或者其他https(无需配置白名单)

背景 支付宝小程序的文档比较奔放&#xff08;高情商说法&#xff09;&#xff0c;兼之支付宝小程序的客服系统和社区生态都比较原始&#xff08;又是高情商说法&#xff09;。 我本以为微信小程序已经是天下无敌&#xff0c;没想到支付宝小程序还能强势出手。 具体需求是这样…

《梦醒蝶飞:释放Excel函数与公式的力量》6.4 TODAY函数

第四节&#xff1a;6.4 TODAY函数 1&#xff09;TODAY函数概述 TODAY函数是Excel中一个非常有用的内置函数&#xff0c;它返回当前的日期。与NOW函数不同&#xff0c;TODAY函数仅返回日期部分&#xff0c;时间部分默认为午夜&#xff08;0:00&#xff09;。 2&#xff09;函…