JWT简介
- 全称:JSON Web Token 官网:https://jwt.io/
- 定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。
由于数字签名的存在,这些信息是可靠的。 - 组成:
第一部分:Header(头),记录令牌类型、签名算法等。 例如:{“alg”:“HS256”,“type”:“JWT”}
第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。例如:{“id”:“1”,“username":“Tom”}
第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。
第一部分和第二部分都是由Base64编码得来的
Base64:是一种基于64个可打印字符(A-Z a-z 0-9 + /)来表示二进制数据的编码方式。
- 场景:登录认证。
登录成功后,生成令牌
后续每个请求,都要携带JWT令牌,系统在每次请求处理之前,先校验令牌,通过后,再处理
JWT生成
- 先在pom.xml配置文件当中导入JWT的依赖
<!-- jwt令牌-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
- 我们之间使用JWT的API工具包来生成JWT令牌
// 生成JWT令牌
@Test
public void genJWT(){
Map<String, Object> claim = new HashMap<>();
claim.put("username", "zhangsan");
claim.put("age", 18);
claim.put("sex", "男");
String jwt = Jwts.builder()
.signWith(SignatureAlgorithm.HS256, "jacky")// 签名算法
.setClaims(claim)// 自定义信息(载荷)
.setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))// 过期时间
.compact();
System.out.println(jwt);
}
JWT校验
// 解析JWT令牌
@Test
public void parseJWT(){
Map<String, Object> claims = Jwts.parser()
// 签名密钥
.setSigningKey("jacky")
// 令牌
.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJzZXgiOiLnlLciLCJleHAiOjE3MjYzMDIzMTUsImFnZSI6MTgsInVzZXJuYW1lIjoiemhhbmdzYW4ifQ.opfndnJ7g9F1PuGKgLDtbcV66FfMdAtTKudUhGU6RgM")
// 获取自定义信息
.getBody();
System.out.println(claims);
}
注意事项
1.JWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的秘钥是配套的。
2.如果JWT令牌解析校验时报错,则说明 JWT令牌被篡改或失效了,令牌非法。