1.什么是jwt
jwt 全称 json web token,通过数组签名的方式,以json作为载体,在不同的服务之前进行安全的传输信息
2.jwt有什么作用
jwt最常见的场景就是授权认证,一旦用户登录之后,后续的每一次请求都会包含jwt,系统在每一次用户请求之前都会验证jwt,通过后在进行处理
3.JWT的组成
JWT由3部分组成,用"."号分割。
1.header
jwt的header承载两部分信息,一个是声明的类型(jwt),一个是声明算法的类型,会将头部header进行base64进行加密
{
'typ': 'JWT',
'alg': 'HS256'
}
base64加密
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
2.payload
载荷就是存放有效信息的地方
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
然后还是进行base64加密
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
3.signature
jwt第三部分就是一个签名信息,签名信息也是由3部分组成
1.header的base64加密
2.payload的base64加密
3.secret
这部分首先由base64加密后的header和base64加密后的payload用“ . ”号连接起来的字符串,然后通过header中的声明的加密算法进行加密,最后就构成了jwt的第三部分
4.代码实现基本使用
public static String jwt(){
JwtBuilder jwtBuilder = Jwts.builder();
String jwt = jwtBuilder
//header
.setHeaderParam("typ", "jwt")
.setHeaderParam("alg", "HS256")
//payload
.claim("userName","jack")
.claim("role","admin")
.setSubject("jwt_test")
//过期时间
.setExpiration(new Date(System.currentTimeMillis()+1000*60*60*24L))
.setId(UUID.randomUUID().toString())
//signature
//加密的时候根据这个key(abcdefg!@#$)进行加密
.signWith(SignatureAlgorithm.HS256,"abcdefg!@#$")
//将header,payload,signature拼接起来
.compact();
return jwt;
}
public static void main(String[] args) {
String jwtToken = jwt();
System.out.println("jwt---->"+jwtToken);
//解密
JwtParser jwtParser = Jwts.parser();
//根据签名对jwtToken进行解析
Jws<Claims> claimsJws = jwtParser.setSigningKey("abcdefg!@#$").parseClaimsJws(jwtToken);
//解析完成之后会拿到这个body,里面就是之前加密之前的一些数据
Claims body = claimsJws.getBody();
System.out.println(body.getId());
System.out.println(body.get("userName"));
System.out.println(body.getExpiration());
System.out.println(body.getSubject());
System.out.println(body);
}
代码运行结果: