一、什么是JWT
JWT(JSON Web Token),是通过数字签名的方式,以JSON 对象为载体,在不同的服务终端之间安全的传输信息。
二、JWT有什么用
JWT 最常见的场景就是授权认证,一旦用户登录,后续每个请求都将包含IWT,系统在每次处理用户请求的之前,都要先进行JWT 安全校验,通过之后再进行处理。
三、JWT的组成
JWT由3部分组成,用 . 拼接,如下
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NzkxNDkyODF9.RAwAFbriV_-MZD_f_b13luMl129DRNXSZ_AN1fLpj5Q
Header
typ:表示token类型
alg:表示加密算法
{
'typ': 'JWT',
'alg': 'HS256'
}
Payload:载荷,存放有效信息的地方
{
'sub': '123456789'
'name': 'Tom'
'admin': true
}
Signature:签名,将加密后的header和payload用点拼接,再将拼接的结果用header声明的加密算法再次加密,就构成了JWT的第三部分
//将加密后的header和payload用点拼接
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
//加密
var signature = HMACSHA256(encodedString, 'secret')
四、入门案例
导入依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!-- jdk8以上(不包含jdk8)需添加下面依赖,jdk8不需要添加下面依赖 -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.4.0-b180830.0359</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>3.0.0-M4</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>3.0.0-M4</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
生成与解密JWT
//定义有效期 一天
private long time = 10000*60*60*24;
//定义签名信息,需要用该签名信息进行解密
private String signature = "admin";
/**
* 生成JWT
*/
@Test
void jwt() {
JwtBuilder jwtBuilder = Jwts.builder();
String jwtToken = jwtBuilder
//header
.setHeaderParam("typ", "JWT")
.setHeaderParam("alg", "HS256")
//payload
.claim("username", "tom")
.claim("role", "admin")
.setSubject("admin-test") //主题
.setExpiration(new Date(System.currentTimeMillis() + time)) //有效期 获取当前系统时间+有效期
//signature
.signWith(SignatureAlgorithm.HS256, signature) //加密算法,签名信息
.compact(); //拼接
System.out.println(jwtToken);
}
/**
* 解密JWT
*/
@Test
void parse(){
String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NzkxNDkyODF9.RAwAFbriV_-MZD_f_b13luMl129DRNXSZ_AN1fLpj5Q";
JwtParser jwtParser = Jwts.parser();
Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
Claims body = claimsJws.getBody();
System.out.println(body.get("username"));
System.out.println(body.get("role"));
System.out.println(body.getSubject());
}