15分钟学会使用JWT
简介
什么是 JWT?
JSON Web Token, 通过数字签名的方式,以JSON对象为载体,在不同的服务终端之间安全的传输信息。
JWT 有什么用?
JWT最常见的场景就是授权认证,一旦用户登录,后续每个请求都将包含JWT, 系统在每次处理用户请求之前,都要先进行JWT安全校验,通过之后再进行处理。
JWT 的组成
JWT 由3部分组成,用 . 拼接
这三部分分别是:
Header
{
'typ': 'JWT',
'alg': 'HS256'
}
token类型jwt 加密算法 HS256
Payload
{
'sub': '1234567890',
'name': 'john',
'admin': true
}
载荷 存放有效信息的地方 标准中注册的声明,公共的声明,私有的声明 进行base64加密就得到第二部分
Signature
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
var signature = HMACSHA256(encodedString, 'secret');
签名 再加盐加密得到第三部分
依赖
pom.xml
<!--核心依赖-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!--使用jwt,如果是jdk1.8以上版本需要这些依赖,不然报错-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
加密
代码示例
@Test
public void testjwt() {
//创建jwt对象
JwtBuilder jwtBuilder = Jwts.builder();
long time = 24*60*60*1000;
//先定义签名信息
String signature = "admin";
//jwt 分三部分,创建也分三部分
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();
//输出
System.out.println(jwtToken);
}
得到输出的jwtToken
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2MzUyNTkyMTMsImp0aSI6IjFhMWYxYmZiLTJjOTMtNDNlMy1hMDVlLWJmZGZhNzJlYmIyZCJ9.7d1ciA2FcmUTHSk-Kkq2bbV3Z5LLGaXBGFQBAlvUnsg
解密
@Test
public void parse () {
String signature = "admin";
String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbiIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2MzUyNTkyMTMsImp0aSI6IjFhMWYxYmZiLTJjOTMtNDNlMy1hMDVlLWJmZGZhNzJlYmIyZCJ9.7d1ciA2FcmUTHSk-Kkq2bbV3Z5LLGaXBGFQBAlvUnsg";
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.get("role"));
System.out.println(claims.getId());
System.out.println(claims.getSubject());
System.out.println(claims.getExpiration());
}
得到输出的内容
tom
admin
1a1f1bfb-2c93-43e3-a05e-bfdfa72ebb2d
admin-test
Tue Oct 26 22:40:13 CST 2021