JWT介绍及使用
JWT-JSON WEB TOKEN
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
JWT组成
一个JWT由head,payload,signature三部分组成,使用
.
进行分隔。例如:
ewogICd0eXAnOiAnSldUJywKICAnYWxnJzogJ0hTMjU2Jwp9.ewogICJzdWIiOiAiMTIzNDU2Nzg5MCIsCiAgIm5hbWUiOiAiSm9obiBEb2UiLAogICJhZG1pbiI6IHRydWUKfQ==.2eab8b1db04001b687461803d759ae849ad795cc9840de1795ccbe54bf4b43d7
header
header
(头部)一般有两个部分:分别是typ和alg。
- typ:表示json的类型,即用来干什么的,在JWT中默认为"JWT"
- alg:表示加密的算法,如HS256。
一个标准的jwt header的json文本如下:
{
'typ': 'JWT',
'alg': 'HS256'
}
通过BASE64进行加密获得一个字符串:ewogICd0eXAnOiAnSldUJywKICAnYWxnJzogJ0hTMjU2Jwp9
payload
payload
(负载)用来保存需要传递的信息的一个json文本。不用来存储敏感信息。
一个自定义的payload:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
通过BASE64进行加密获得一个字符串:ewogICJzdWIiOiAiMTIzNDU2Nzg5MCIsCiAgIm5hbWUiOiAiSm9obiBEb2UiLAogICJhZG1pbiI6IHRydWUKfQ==
signature
signature(签名)用来校验当前的jwt是否经过篡改,用来校验其有效性的。
signature是通过header和payload获得的两个BASE64加密后的字符串拼接后进行摘要后得到的一个字符串。
String secret = "secret"; //盐,也就是保存在服务器的私钥,用于校验
String encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload);
String signature = HMACSHA256(encodedString, secret);
这样我们就得到一个signature字符串:
2eab8b1db04001b687461803d759ae849ad795cc9840de1795ccbe54bf4b43d7
将这三者进行拼接,使用.
拼接即可得到JWT。
ewogICd0eXAnOiAnSldUJywKICAnYWxnJzogJ0hTMjU2Jwp9.ewogICJzdWIiOiAiMTIzNDU2Nzg5MCIsCiAgIm5hbWUiOiAiSm9obiBEb2UiLAogICJhZG1pbiI6IHRydWUKfQ==.2eab8b1db04001b687461803d759ae849ad795cc9840de1795ccbe54bf4b43d7
JWT校验
使用SHA256算法将
header.payload
进行盐值摘要,得到一个字符串signature。如果和jwt中的signature相同的话,那么表示当前的JWT是由我们下发的。这时,我们就可以根据BASE64进行解密获取其中的数据来进行业务操作。
如果不同的话,那么表示该JWT不是我们下发的,停止之后的操作即可。
JWT获取信息
对于前台获取数据,我们可以直接将payload进行BASE64解密,因为我们相信该JWT来源,就算是被篡改的,也会被服务端进行校验。
JJWT(java jwt api)使用
JJWT
是一个供生成和解析jwt的java端工具。官方网址
导入依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId> <!-- or jjwt-gson if Gson is preferred -->
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
测试代码
User user = new User();
user.setId(1L);
user.setLogin("user");
user.setPassword("user");
user.setRole("ROLE_USER");
String secretKey = "MDk5ZmU2YzdhZWE5NWRhZTU0MjgzMTVmMTkxYTI5ZGJmODc3NWU2ZDc5OWI1YWMxZTE5NWYxZWVhY2VmZGYwMWQ1NmExNjI4M2M2OWUzOGM0Nzg1ZGU2YzgxNWVjYzNhODg4YzE0ODhlZDA0YjZlYTgzYzk3MGE4NWFkMmJmOGI=";
byte[] keyBytes = Decoders.BASE64.decode(secretKey);// 私钥必须使用BASE64来获取bytes
Key key = Keys.hmacShaKeyFor(keyBytes);// 创建自定义私钥
String jws = Jwts.builder().setSubject("Joe").signWith(key).compact();// 官方示例
System.out.println(jws);
String compact = Jwts.builder()
.setSubject(user.getLogin())
.signWith(key,SignatureAlgorithm.HS512) // 默认使用HS256加密算法
.setExpiration(new Date(new Date().getTime() + 10000))
.compact();
System.out.println(compact);
//需要同时进行测试,否则会报解析异常。
Claims body = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(compact).getBody();
System.out.println(body);
String subject = body.getSubject();
System.out.println(subject);
得到结果:
eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJKb2UifQ.Y3dJ9pJiIoq3Py4xe445ud6Mk02v-N0rBFa8v3zlwZycjoVXOObRGSuyyMw4vhbhwuGIEj4fdIbe9P68Y8tXaA
eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ1c2VyIiwiZXhwIjoxNjA2ODA2OTcxfQ.GAw3fSU3r6qq7tcPrjqlj4tVh0tGK-GqWGLfPUQfeVIAvRF2_1GEQySYgoRvVc24fw-AcjFO4UIcuWcrvZO_Rg
{sub=user, exp=1606806971}
user
其中header
和body
可以直接BASE64解密获得数据。
JWT介绍及使用的更多相关文章
- oAuth2.0及jwt介绍
oAuth2.0流程示意如下: 关于jwt介绍: 说明: 关于jwt简单说明一下,jwt即为json web token,是用来和服务端建立加密通信所使用的的一种“约定”,主要组成见上图即可.服务端一 ...
- 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_11-SpringSecurityOauth2研究-JWT研究-JWT介绍
3.6 JWT研究 3.6.1 JWT介绍 在介绍JWT之前先看一下传统校验令牌的方法,如下图: 问题: 传统授权方法的问题是用户每次请求资源服务,资源服务都需要携带令牌访问认证服务去校验令牌的合法性 ...
- day4(JWT介绍)
1.JWT介绍 1.1jwt原理 最简单理解:jwt本质就是, 把用户信息通过加密后生成的一个字符串 JWT的原则是在服务器身份验证之后,将生成一个JSON对象并将其发送回用户 { "Use ...
- Python JWT 介绍
Python JWT 介绍 目录 Python JWT 介绍 1. JWT 介绍 2. JWT 创建 token 2.1 JWT 生成原理 2.2 JWT 校验 token 原理 3. 代码实现 4. ...
- rbac介绍、自动生成接口文档、jwt介绍与快速签发认证、jwt定制返回格式
今日内容概要 RBAC 自动生成接口文档 jwt介绍与快速使用 jwt定制返回格式 jwt源码分析 内容详细 1.RBAC(重要) # RBAC 是基于角色的访问控制(Role-Based Acces ...
- JWT 介绍 - Step by Step
翻译自 Mohamad Lawand 2021年3月11日的文章 <Intro to JWT - Step by Step> [1] 在本文中,我将向您介绍 JWT[2]. 我们今天要讲的 ...
- jwt介绍
jwt原理 最简单理解:jwt本质就是, 把用户信息通过加密后生成的一个字符串 JWT的原则是在服务器身份验证之后,将生成一个JSON对象并将其发送回用户 { "UserName" ...
- JWT 在前后端分离中的应用与实践
关于前后端分离 前后端分离是一个很有趣的议题,它不仅仅是指前后端工程师之间的相互独立的合作分工方式,更是前后端之间开发模式与交互模式的模块化.解耦化.计算机世界的经验告诉我们,对于复杂的事物,模块化总 ...
- 深入浅出JWT(JSON Web Token )
1. JWT 介绍 JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象安全传输信息. 这些信息可以通过数字签名进行 ...
随机推荐
- mysql-索引对性能影响
1.添加索引后查询速度会变快 mysql中索引是存储引擎层面用于快速查询找到记录的一种数据结构,索引对性能的影响非常重要,特别是表中数据量很大的时候,正确的索引会极大的提高查询效率.简单理解索引,就相 ...
- 微信小程序节流使用方法
函数节流: 英文 throttle 有节流阀的意思.大致意思也是 节约触发的频率 那么,函数节流,真正的含义是:单位时间n秒内,第一次触发函数并执行,以后 n秒内不管触发多少次,都不执行.直到下一个单 ...
- 原生JS实现拼图游戏
最近无聊,练练原生JS:实现拼图游戏.两种玩法:第一种是单击元素进行交换位置:第二种是拖拽元素进行位置交换.首先需要上传图片并进行回显(需要用到FileReader):下面是部分截图: 可以自行设置切 ...
- TypeError: put() missing 1 required positional argument: 'item'问题分析
今天博主在练习带参数线程池的时候与到了如下问题: 翻译过来,就是缺少位置参数. 一.错误1 如果此时你的代码高亮是这样: 解决办法:在init魔法方法下的Queue没有加括号,即 self.q = Q ...
- jdbc创建数据库的连接
package com.gylhaut.db; import java.sql.Connection;import java.sql.DriverManager;import java.sql.Res ...
- 【面经】MySql常见问题
1. 数据库三范式是什么? 1. 第一范式(1NF):字段具有原子性,不可再分.(所有关系型数据库系统都满足第一范式数据库表中的字段都是单一属性的,不可再分) 2. 第二范式(2NF)是在第一范式(1 ...
- windows安装oos遇到的坑 (汇总)
一.环境安装 -- 搭建域控服务器 1. 打开服务器管理器,添加角色和功能: 2.下一步: 3.下一步: 4.下一步 5.选择添加AD域服务,同时添加所需功能,下一步: 6.安装功能,下一步: 7. ...
- RabbitMQ Go客户端教程3——发布/订阅
本文翻译自RabbitMQ官网的Go语言客户端系列教程,本文首发于我的个人博客:liwenzhou.com,教程共分为六篇,本文是第三篇--发布/订阅. 这些教程涵盖了使用RabbitMQ创建消息传递 ...
- [happyctf]部分writeup
题目名称:sqltest所属:MISC考察点:盲注 眼力 耐心(好吧是废话) 附件下载下来 ,到手一个流量包,用wireshark打开,大致浏览了一下,抓的应该是盲注的数据流量. 这里有一个经验问题, ...
- 恢复训练(学不动了摸会鱼) Pt. 1
本来下午想把pre稿子写了,咕咕咕. 群论是啥也不会了,写个polya试试(手动doge)为什么博客媛没有emoji,以后万一自己搭博客一定要加上这个小东西 polya淼题:poj1286 先复吸一下 ...