JWT——jjwt使用

文章目录

  • 一、JWT是什么?
  • 二、JWT构成
    • 0、header.payload.signature
    • 1、header 头部 (JSON数据,Base64加密)
    • 2、payload 载荷 (JSON数据,Base64加密)
      • 2.1、Public claims(公共的声明)
      • 2.2、Private claims(私人声明)
      • 2.3 注意:
    • 3、signature 签名:
  • 三、使用场景
  • 四、JAVA项目使用
    • 1、Maven依赖
    • 2、生成Token方法
    • 3、解析Token方法

一、JWT是什么?

JWT (JSON Web Token) 是一种用于身份验证和授权的安全传输数据的开放标准。

二、JWT构成

0、header.payload.signature

1、header 头部 (JSON数据,Base64加密)

报头通常由两部分组成: Token的类型(即 JWT)和所使用的签名算法(如 HMAC SHA256或 RSA)。

  • alg : HS256 : 签名使用的算法
  • typ : JWT :标识JWT

2、payload 载荷 (JSON数据,Base64加密)

载荷是实际的数据,其中包含声明。声明是关于实体(通常是用户)和其他数据的语句。
有三种类型的声明:

  • registered claims,
  • public claims
  • private claims。

下面是预定义的数据。

  • iss: jwt签发者
  • sub: jwt所面向的用户
  • aud: 接收jwt的一方
  • exp: jwt的过期时间,这个过期时间必须要大于签发时间
  • nbf: 定义在什么时间之前,该jwt都是不可用的.
  • iat: jwt的签发时间
  • jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击

2.1、Public claims(公共的声明)

使用 JWT 的人可以随意定义这些声明( 可以自己声明一些有效信息如用户的id,name等,但是不要设置一些敏感信息,如密码 )。但是为了避免冲突,应该在 JWT注册表中定义它们,或者将它们定义为包含抗冲突名称空间的 URI。

2.2、Private claims(私人声明)

这些是创建用于在同意使用它们的各方之间共享信息的习惯声明,既不是注册声明,也不是公开声明( 私人声明是提供者和消费者所共同定义的声明 )。

2.3 注意:

对于已签名的Token,这些信息虽然受到保护,不会被篡改,但任何人都可以阅读。除非加密,否则不要将机密信息放在 JWT 的有效负载或头元素中。

3、signature 签名:

签名用于验证JWT的完整性,确保在传输过程中没有被篡改。
公式:
HMACSHA256(base64UrlEncode(header) + “.” +base64UrlEncode(payload), secret)

三、使用场景

  • Web API:JWT可以作为一种安全且高效的方式来验证请求,保护Web API不被恶意请求和数据盗用。

  • 单点登录(SSO):JWT可以使用户在一次身份验证后,通过使用同一个认证令牌,来访问多个应用程序。这样可以简化用户在不同应用程序之间的登录流程,提高用户体验。

四、JAVA项目使用

1、Maven依赖

<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt-api -->
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.12.3</version>
</dependency>

2、生成Token方法

//私钥,注意私钥长度至少43位,不然生成Token会报错
public static String secret ="123456789a123456789a123456789a123456789a123";
public static String createToken(){// HeaderMap<String, Object> header = new HashMap<>();header.put("alg", "HS256");header.put("typ", "JWT");// PayloadMap<String, Object> payload = new HashMap<>();payload.put("id", "malu_code");payload.put("name","码鹿");payload.put("admin",true);// 声明Token失效时间Calendar instance = Calendar.getInstance();instance.add(Calendar.SECOND,300);// 300s// 生成TokenString token = Jwts.builder().setHeader(header)// 设置Header.setClaims(payload) // 设置Payload.setExpiration(instance.getTime())// 设置生效时间.signWith(SignatureAlgorithm.HS256,secret) // 签名,这里采用私钥进行签名,不要泄露了自己的私钥信息.compact(); //生成Tokenreturn  token;
}

3、解析Token方法

如果可以成功解析、不报异常,那token就是对的。

//私钥,注意私钥长度至少43位,不然生成Token会报错
public static String secret ="123456789a123456789a123456789a123456789a123";
public static boolean parserToken(String token) {JwtParser jwtParser = Jwts.parser().setSigningKey(secret).build();try {Jws<Claims> claimsJws = jwtParser.parseClaimsJws(token);// 解析head信息JwsHeader header = claimsJws.getHeader();// 解析PayloadClaims claims = claimsJws.getBody();System.out.println(claims);// 解析SignatureString signature = claimsJws.getSignature();System.out.println(signature); }catch (Exception e){return false;}return true;
}

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

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

相关文章

第六十五章 符号概览

文章目录 第六十五章 符号概览其他形式abcdef{"abc":(def),"abc":(def),"abc":(def)}{abcdef}{%%CLASSNAME}&sql(xxx)[abcdef,abcdef,abcdef]*abcdef?abcdefabcdef 第六十五章 符号概览 其他形式 abcdef ^abcdef "abcdef" 这…

YOLOv7-PTQ量化部署

目录 前言一、PTQ量化浅析二、YOLOv7模型训练1. 项目的克隆和必要的环境依赖1.1 项目的克隆1.2 项目代码结构整体介绍1.3 环境安装 2. 数据集和预训练权重的准备2.1 数据集2.2 预训练权重准备 3. 训练模型3.1 修改模型配置文件3.2 修改数据配置文件3.3 训练模型3.4 mAP测试 三、…

[Spring] SpringBoot2 简介(一)—— 基础配置

目录 一、SpringBoot 简介 1、Spring 的缺点 2、SpringBoot 功能 二、SpringBoot 入门案例 1、实现步骤 2、访问服务器 3、入门小结 4、Idea 快速构建 SpringBoot 工程 5、起步依赖无需版本号 6、主启动类的在项目中的位置&#xff08;*重要*&#xff09; 三、Sprin…

【小白专用 已验证】PHP连接SQLServer数据库

PHP是一门强大的服务器端脚本语言&#xff0c;而SQL Server是Microsoft开发的一款关系型数据库管理系统。为了在PHP中直接操纵SQL Server数据库&#xff0c;需要通过安装SQL Server扩展来实现。这篇文章将详细介绍如何在PHP中使用SQL Server扩展来操作数据库。 首先&#xff0…

链表的中间结点-力扣

1、题目描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海…

使用 Rust 和 cURL 库下载程序

以下是一个使用 Rust 和 cURL 库的下载器程序&#xff0c;用于下载 图像。此程序使用了 https://www.duoip.cn/get_proxy 的代码。 extern crate curl; ​ use std::io::{self, Read}; use std::error::Error; ​ fn main() {let url "https://www.baidu.com";let …

USB学习(1):USB基础之接口类型、协议标准、引脚分布、架构、时序和数据格式

连接计算机外围设备最简单的方法是通过USB(通用串行总线)。USB是即插即用接口&#xff0c;可以将扫描仪、打印机、数码相机、闪存驱动器等计算机外围设备连接到计算机上。本篇文章就来介绍一下USB的一些基础知识&#xff0c;包括。 文章目录 1 接口类型和标准规范2 引脚分布3 …

【RuoYi移动端】uni-app中的单击和双击事件

1、单击事件&#xff1a; click"enterpriseSelect" 2、双击事件&#xff1a; touchend"userinfo"

TypeScript环境安装

一、windows环境 安装node&#xff0c;附带自动安装npm工具 安装tsc npm install -g typescript 对于不支持 Nuget 的项目类型&#xff0c;你可以使用 TypeScript Visual Studio 扩展。 你可以使用 Visual Studio 中的 Extensions > Manage Extensions 安装扩展。 安装下…

第三节——Vue 基础语法

vue语法分为选项是API&#xff08;Option api&#xff09;和组合式api&#xff08;Composition Api&#xff09;,我们以选项式Api入门 一、基本构成 template、script、style三部分构成。template可以理解成编写html的地方&#xff0c;script编写逻辑js的地方&#xff0c;sty…

centos如何根据端口号查询程序路径

centos如何根据端口号查询程序路径 如果是半路接受的应用&#xff0c;上个人只给你说了程序的端口号&#xff0c;别的都没&#xff0c;那怎么找程序的路径哪&#xff1f;一是给上上个人要&#xff0c;二是自己找&#xff08;我是自己找的&#xff09; 小白教程&#xff0c;一…

【计网 DNS】计算机网络 DNS协议详解:中科大郑烇老师笔记 (六)

目录 0 引言1 DNS概述1.1 定义1.2 DNS域名结构1.2 域名解析步骤 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;计算机四大基础专栏&#x1f4dc; 其他章节&#xff1a;网络快速入门系列、计算机网络&#xff08;一&#xff09;、计算机网络&…

自然语言处理---迁移学习实践

1 微调脚本介绍 指定任务类型的微调脚本: huggingface研究机构提供了针对GLUE数据集合任务类型的微调脚本, 这些微调脚本的核心都是微调模型的最后一个全连接层。通过简单的参数配置来指定GLUE中存在任务类型(如: CoLA对应文本二分类&#xff0c;MRPC对应句子对文本二分类&…

Java基础面试题知识点总结(上篇)

大家好&#xff0c;我是栗筝i&#xff0c;从 2022 年 10 月份开始&#xff0c;我持续梳理出了全面的 Java 技术栈内容&#xff0c;一方面是对自己学习内容进行整合梳理&#xff0c;另一方面是希望对大家有所帮助&#xff0c;使我们一同进步。得到了很多读者的正面反馈。 而在 2…

分享一下我家网络机柜,家庭网络设备推荐

家里网络机柜搞了几天终于搞好了&#xff0c;非专业的&#xff0c;走线有点乱&#xff0c;勿喷。 从上到下的设备分别是&#xff1a; 无线路由器&#xff08;当ap用&#xff09;:TL-XDR6088 插排&#xff1a;德木pdu机柜插排 硬盘录像机&#xff1a;TL-NVR6108-L8P 第二排左边…

面试题 02.01. 移除重复节点

​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;110. 平衡二叉树 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 哈希表。遍历链表若当前元素在哈希表中&#xff0c;则将其删除&#xff0c;否则将其加入哈希表。 解题代码&#xff1a; /*…

Python中不同进制间的转换

Python中不同进制间的转换 一、不同进制在计算机科学、数学和其他领域中具广泛的应用。以下是一些常见的应用&#xff1a;1. 二进制&#xff08;base-2&#xff09;: 在计算机系统中&#xff0c;数据以二进制形式存储和处理。二进制由0和1组成&#xff0c;是数字电子技术的基础…

【Spring Cloud Alibaba】seata分布式事务官方入门案例(实战版)

文章目录 1. 业务介绍1.1. 用例1.2. 架构图1.3. 3个服务的代码及业务逻辑&#xff08;略&#xff09; 2. SEATA 的分布式交易解决方案3. 由Dubbo SEATA提供支持的示例&#xff08;实战&#xff09;3.1. 步骤 1&#xff1a;建立数据库&#xff0c;如seata数据库3.2. 步骤 2&…

flink中使用异步函数的几个注意事项

背景 在flink系统中&#xff0c;我们为了补充某个流事件成一个完整的记录&#xff0c;经常需要调用外部接口获取一些配置数据&#xff0c;流事件结合这些配置数据就可以组合成一条完整的记录&#xff0c;然而如果同步调用外部系统接口来实现&#xff0c;那么会有很大的性能瓶颈…

2023高频前端面试题(含答案)

一、简单页面1、CSS选择器样式优先级2、CSS实现三列布局&#xff08;左右固定宽度&#xff0c;中间自适应&#xff09; &#xff08;1&#xff09;CSS浮动 第一个float:left&#xff0c;第二个float:right&#xff0c;第三个设置margin-left和margin-right &#xff08;2&#…