JWT基础入门
## 1. 介绍
JWT 全称:JSON Web Token
JWT官网:JSON Web Tokens - jwt.io
JWT定义了一种简洁的、自包含式,用于在通信双方以JSON数据格式安全传输信息。
由于数字签名的存在,这些信息是可靠的。
2. 组成
- Header (头):记录令牌的类型,签名算法等,如:{alg:"H5256",Type:"JWT"}
基于Base 64 编码来表示二进制的编码方式
- payLoad (有效荷载) :携带一些自定义信息,默认信息等,如:{id:"1",username:"Tom"}
基于Base 64 编码来表示二进制的编码方式
- signature (签名) ,防止Token被篡改,确保安全性,将Header、payload、并加入指定密钥,通过指定签名算法而来
签名算法中融入头部分和信息部分,不是base 64编码
3. JWT令牌生成和解析
1. 导入jar包
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
2. 令牌生成
SignatureAlgorithm hs256 = SignatureAlgorithm.HS256;// 设置签名算法
String signKey = "LuckyDu"; // 加盐 不能过短,过短会报错,至少4个字符,具体版本不同可能不一样
HashMap<String, Object> map = new HashMap<>(); // 数据存储
map.put("id",1);
map.put("name","LuckyDu");
Date timeOut = new Date(System.currentTimeMillis() + 3600*1000); //设置过期时间
String compact = Jwts.builder()
.signWith(hs256, signKey) // 设置JWT头部信息,加密算法和盐值
.setClaims(map) // 设置JWT的荷载信息,需要一个Map集合存储
.setExpiration(timeOut) // 设置过期时间,设置的是时间点
.compact(); // 调用生成令牌
System.out.println("compact = " + compact);
注意:
1. 加盐不能过短,否则会抛出一个异常 2. 数据存储需要一个Map集合 3. 过期时间填写的是在什么时间过期 4. 调用compact生成令牌
3. 令牌解析
String compact = ""; // JWT生成的Token令牌
String signKey = "luckyDu"; // 在生成令牌时的 盐值,要保证生成和解析的值一样
JwsHeader header = Jwts.parser() // 解析JWT令牌方法
.setSigningKey(signKey) // 设置盐值
.parseClaimsJws(compact) // 传入生成的令牌
//.getHeader(); // 获取到JWT令牌的第一部分内容 头信息
//.getBody();// 获取令牌的荷载信息
// Object id = body.get("id"); // 在荷载信息中通过key寻找对应的value值
//.getSignature() // 获取到JWT令牌的第三部分签名内容
注意:
1. 在生成令牌时的 盐值,要保证生成和解析的值一样 2. 在JWT解析时,若没有抛出异常,那么JWT解析为正确,抛出异常基本为以下几种,部分可能未发现,自测
// 头部信息出错抛出异常 MalformedJwtException
// 荷载信息出错抛出异常 SignatureException
JWT签名与本地计算的签名不匹配。JWT有效性不能断言,不应该被信任。
// 签名信息出错抛出异常 SignatureException
JWT签名与本地计算的签名不匹配。JWT有效性不能断言,不应该被信任。
// JWT令牌过期抛出异常 ExpiredJwtException
4. 项目中使用
在前后端分离的项目中使用的时候我们只需要将我们生成的 JWT令牌传输发送给前端
在每次前端向服务端发送请求时需要在头部请求信息中加上token字段,携带上我们的token信息
若token不存在或出现问题后端给予对应的响应即可
5. Java工具类
Java 工具类可在本博客中搜索jwt工具类