JWT是什么?
jwt一般是用来进行授权认证。
每当用户登录的时候,其后续的每个请求都会携带jwt,然后系统在每次处理用户的请求之前,都会先进行jwt安全校验,通过之后再进行处理。
JWT的组成
jwt可以看成是一个长字符串,由三部分组成:header, payload,以及两者结合加密形成的signature,中间使用.进行拼接。
eyJ0eXAiOiJqd3QiLCJhbGciOiJIUzI1NiJ9
.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NDQ1MDIxMTgsImp0aSI6IjBmZDVhOTUxLTlkMTgtNDZmYS1hM2MxLTNhYzFjNmNhNDczYyJ9
.wme3-LSkTZuWaQ2H1-0Wht0-S-pQIoaCBzX_YP-yiF8
相关方法
- 使用jwt引用的依赖
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
- 生成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()+1000*60*60*24))
.setId(UUID.randomUUID().toString())
//signature
//后面那个value可以自定义,是作为signature的一个key,解密的时候需要用这个作为key进行解密
.signWith(SignatureAlgorithm.HS256,"amdin")
//拼接
.compact();
- 解码jwt
String jwtToken = "eyJ0eXAiOiJqd3QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NDQ1MDIxMTgsImp0aSI6IjBmZDVhOTUxLTlkMTgtNDZmYS1hM2MxLTNhYzFjNmNhNDczYyJ9.wme3-LSkTZuWaQ2H1-0Wht0-S-pQIoaCBzX_YP-yiF8";
JwtParser jwtParser = Jwts.parser();
Jws<Claims> claimsJws = jwtParser.setSigningKey("admin").parseClaimsJws(jwtToken);
Claims claims = claimsJws.getBody();
System.out.println(claims.getId());
System.out.println(claims.getExpiration());
System.out.println(claims.getSubject());