简介
全称:JSON Web Token (https://jwt.io/)
定义了一种简洁的、自包含的格式,用于通信双方已JSON数据格式安全的传输信息。
组成
- Header(头):记录令牌类型和签名算法等。
- PayLoad(荷载):携带自定义的信息。
- Signature(签名):对头部和荷载进行加密计算得到。
生成JWT
pom.xml引入java-jwt坐标
<!--java-jwt坐标-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
@Test
public void testGen(){
Map<String,Object> claims = new HashMap<>();
claims.put("id",1);
claims.put("username","张三");
// 生成jwt的代码
String token = JWT.create()
.withClaim("user",claims) // 添加载荷
.withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60*12)) // 添加过期时间
.sign(Algorithm.HMAC256("abc")); // 指定算法,配置秘钥
System.out.println(token);
}
运行程序即可得到生成的token。生成以后,需要对其进行验证。
JWT验证
@Test
public void testParse(){
// 定义字符串,模拟用户传递过来的token
String token = "生成的token";
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("abc")).build();
DecodedJWT decodedJWT = jwtVerifier.verify(token); // 验证token,生成一个解析后的JWT对象
Map<String, Claim> claims = decodedJWT.getClaims();
System.out.println(claims.get("user"));
}
运行程序可以得到:
注意事项
- JWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的秘钥是配套的。
- 如果JWT令牌解析校验时报错,则说明JWT令牌被篡改或者失效了,令牌非法。