JWT使用
什么是JWT?
JSON Web Token,通过数字签名的方式,以ISON 对象为载体,在不同的服务终端之间安全的传输信息。
JWT有什么用?
JWT 最常见的场景就是授权认证,一旦用户登录,后续每个请求都将包含JWT,系统在每次处理用户请求的之前,都要先进行JWT安全校验,通过之后再进行处理
JWT的组成
JWT由3部分组成,用.拼接
eyJhbGcioiJIUzI1NiIsInR5cCI6IkpxVCJ9.eyJ1c2VybmFtZSI6IlRvbsIsInJvbGUioijhzGlpbiIsInN1YiI6ImFkbwluLXRIc3QiLCJleHAiojE2MjMyMjM2NzUsImpOaSI6ImQ2MTIjzjcxLWI5ZmUtNGMwNy04MZQwLTViowVizmMyNjExNyJ9.FOS9Y7rYNdc2A0idnsPrgg2XTYePuOyGz598h2gtabE
这三部分分别是:
Header:
'typ':'JwT',
alg':'HS256'
Payload:
"sub": 1234567890
"name":'john'
admin":true
Signature:
var encodedstring = base64UrlEncode(header) + base64UrTEncode(payload);
添加依赖:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
编写测试
// 定义过期时间
private long expire = 1000*60*60*24 ;// 毫秒
// 定义加密的密钥
private String secret = "nice.to.meet.you";
@Test// 1. 生成token
void createToken(){JwtBuilder builder = Jwts.builder();
String Token = builder
//header
.setHeaderParam("typ","JWT")
.setHeaderParam("alg", "HS256")
//payload
.claim("username", "tom")
.claim("role", "admin")
.setIssuedAt(new Date()) // 设置发布日期
.setExpiration(new Date(System.currentTimeMillis()+expire))// 设置过期时间
.setId(UUID.randomUUID().toString())
//signature 加密的密钥
.signWith(SignatureAlgorithm.HS256, secret)// SignatureAlgorithm.HS256 :选择的加密算法, 也可以选择其他的加密算法
.compact();
System.out.println(Token);
}
查看输出结果
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsImlhdCI6MTY4MDUxNDM1NywiZXhwIjoxNjgwNjAwNzU3LCJqdGkiOiJiODVmY2FhMy1kZjNkLTQ3M2MtYWFjOC1iNmZhZjcyN2JmZTUifQ.IIxMqwDQ6Wd7ktntkrAFsf86bHjx9Lqu2RFie57a4qM
对生成的结果进行解密
@Test
void parse(){
String Token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsImlhdCI6MTY4MDUxNDM1NywiZXhwIjoxNjgwNjAwNzU3LCJqdGkiOiJiODVmY2FhMy1kZjNkLTQ3M2MtYWFjOC1iNmZhZjcyN2JmZTUifQ.IIxMqwDQ6Wd7ktntkrAFsf86bHjx9Lqu2RFie57a4qM";
JwtParser jwtParser = Jwts.parser();
Jws<Claims> claimsJws = jwtParser.setSigningKey(secret).parseClaimsJws(Token);
Claims claims = claimsJws.getBody();
System.out.println(claims.get("username"));
System.out.println(claims.get("role"));
System.out.println(claims.getId());
System.out.println(claims.getExpiration());}
输出结果