1. 什么是JWT
JWT本质是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输。
2.JWT的认证流程如下:
- 首先,前端通过Web表单将自己的用户名和密码发送到后端的接口,这个过程一般是一个POST请求。建议的方式是通过SSL加密的传输(HTTPS),从而避免敏感信息被嗅探
- 后端核对用户名和密码成功后,将包含用户信息的数据作为JWT的Payload,将其与JWT Header分别进行Base64编码拼接后签名,形成一个JWT Token,形成的JWT Token就是一个如同lll.zzz.xxx的字符串
- 后端将JWT Token字符串作为登录成功的结果返回给前端。前端可以将返回的结果保存在浏览器中,退出登录时删除保存的JWT Token即可
- 前端在每次请求时将JWT Token放入HTTP请求头中的Authorization属性中(解决XSS和XSRF问题)
后端检查前端传过来的JWT Token,验证其有效性,比如检查签名是否正确、是否过期、token的接收方是否是自己等等
6.
验证通过后,后端解析出JWT Token中包含的用户信息,进行其他逻辑操作(一般是根据用户信息得到权限等),返回结果
3.JWT优势
4.Demo
4.1导入依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
注意:JDK版本1.8以上 要导入下面的依赖
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
4.2 编写测试用例
package com.itheima;
import io.jsonwebtoken.*;
import org.junit.jupiter.api.Test;
import java.util.Date;
import java.util.HashMap;
public class JWTTest {
@Test
public void generateJwtTest(){
//1.定义数据
HashMap hashMap = new HashMap();
hashMap.put("userId", String.valueOf(12345));
hashMap.put("phone", String.valueOf(1311111212));
long now = System.currentTimeMillis();
//2.创建jwt
String token = Jwts.builder()
//1.header 加密算法 2.playload 3.自定义字符串
.signWith(SignatureAlgorithm.HS256, "renxu")
.setClaims(hashMap)
.setExpiration(new Date(now + 500000))
.compact();
System.out.println(token);
}
@Test
public void paraseJwtTest(){
String token ="eyJhbGciOiJIUzI1NiJ9.eyJwaG9uZSI6IjEzMTExMTEyMTIiLCJleHAiOjE2NTg4ODgyMDAsInVzZXJJZCI6IjEyMzQ1In0.5i6tr0DjJ8Fq00S9KopZCiRfE5ca3sxp-MngTCO3s4M";
try {
Claims claims = Jwts.parser()
.setSigningKey("renxu")
.parseClaimsJws(token)
.getBody();
String userId = (String) claims.get("userId");
String phone = (String) claims.get("phone");
System.out.println(userId);
System.out.println(phone);
} catch (ExpiredJwtException e) {
System.out.println("token失效");
} catch (SignatureException e){
System.out.println("token有误");
}
}
}