认识
JWT: JSON Web Token,通过数字签名的方式,以JSON对象为载体,在不同服务终端之间安全地传输信息。
用处: 授权认证,用户登录后,后续请求都携带JWT,后端处理请求前,要先校验JWT,然后再处理。
组成: 用.拼接三部分,分别是
- Header (头部,记录了整个令牌的类型和签名算法,将信息用base64编码,构成第一部分)
{
'typ': 'JWT',//token的类型
'alg': 'HS256'//第三部分签名加密算法的名称
//HS256:一种对称加密算法,使用同一个秘钥对signature加密解密
//RS256:一种非对称加密算法,使用私钥加密,公钥解密
}
- Payload (载荷,记录了保存的主体信息,比如你要保存的用户信息就可以放到这里,分为标准注册声明、公共声明、私有声明,用base64编码,构成第二部分)
{
'sub': '1234567890',
'name': 'john',
'admin': true
}
- Signature (签名,按照头部固定的签名算法对整个令牌进行签名,该签名的作用是:保证令牌不被伪造和篡改)
String encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
String signature = HMACSHA256(encodedString, 'secret');
//将生成的结果encodedString用header中声明的算法进行加盐加密,构成第三部分
使用
pom中引入jwt依赖
private long time = 1000*60*60*24;//设定过期时间
private String signature = "secret";//用于解密
public 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))
.setId(UUID.randomUUID().toString())
//signature
.signWith(SignatureAlgorithm.HS256, signature)
.compact();
}
public void parse(){
String token = "abc";
JwtParser jwtParser = Jwts.parser();
Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
Claims claims = claimsJws.getBody();
claims.get("username");
claims.get("role");
claims.getId();
claims.getSubject();
claims.getExpiration();
}