JWT => json web token的简称
简介
- 数字签名方式,以JSON对象为载体,在不同服务终端之间安全的传输信息。
- 常用用于授权验证,后续每个请求都会包含JWT,系统每次处理用户请求之前,都会进行JWT安全校验,通过后再进行处理
- JWT使用 . 来进行分隔
三个组成部分
header
{
'typ': 'JWT',
'alg': 'HS256'
}
- typ -> token类型
- alg -> 算法类型
Payload
{
"user": "ask",
"admin": true
}
- 存储数据
Signature
把加密之后的header 和 加密之后的payload 进行再次加密
Example
依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
生成JWT
@Test
public void jwt() {
JwtBuilder jwtBuilder = Jwts.builder();
String jwtToken = jwtBuilder
// header
.setHeaderParam("typ", "JWT")
.setHeaderParam("alg", "HS256")
// payload
.claim("username", "ask")
.claim("role", "admin")
.setSubject("eva02")
.setExpiration(new Date(System.currentTimeMillis() + time))
.setId(UUID.randomUUID().toString())
// signature
.signWith(SignatureAlgorithm.HS256, signature)
.compact();
System.out.println(jwtToken);
}
分析
- setHeaderParam -> 设置 Header头信息
- claim -> 携带的数据
- setSubject -> 设置主机
- setExpiration -> 保存时间
- setId -> 设置ID
- signWith -> 声明算法和签名
- compact -> 拼接
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFzayIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImV2YTAyIiwiZXhwIjoxNjUxNzMxOTgzLCJqdGkiOiJlYTQwYTFkMC00YjhlLTQ0YjYtYmYxZC1hZDYxYzRlMTMxM2MifQ.NnpyfCMfqRdpR5VW0BXIC9-K_I31ll1c9W1NU2wMB-U
解析
@Test
public void parse(){
String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFzayIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImV2YTAyIiwiZXhwIjoxNjUxNzMxOTgzLCJqdGkiOiJlYTQwYTFkMC00YjhlLTQ0YjYtYmYxZC1hZDYxYzRlMTMxM2MifQ.NnpyfCMfqRdpR5VW0BXIC9-K_I31ll1c9W1NU2wMB-U";
JwtParser jwtParser = Jwts.parser();
Jws<Claims> claimsJws = jwtParser
.setSigningKey(signature)
.parseClaimsJws(token);
Claims claims = claimsJws.getBody();
System.out.println(claims.get("username"));
System.out.println(claims.getSubject());
}
- JwtParser jwtParser = Jwts.parser(); -> 声明解析
- setSigningKey -> 带入签名
- parseClaimsJws -> token信息
- getBody -> 获取解析数据
- get… -> 获取相关数据