JWT的简单使用
1. 引入JWT依赖
<!-- https://mvnrepository.com/artifact/com.auth0/java-jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.19.2</version>
</dependency>
2. JWT生成令牌
@Test
void testJWT() {
Map<String, Object> map = new HashMap<>();
Calendar instance = Calendar.getInstance();
//添加过期时间,这里是两分钟后过期;
instance.add(Calendar.SECOND, 120);
// 生成令牌
String token = JWT.create()
.withHeader(map) // header:一般不进行更改,默认值为 HS256 和 JWT
.withClaim("userId", 21) //payload:可以添加多个数据
.withClaim("username", "xiaohei")
.withExpiresAt(instance.getTime()) //指定令牌过期时间
.sign(Algorithm.HMAC256("!FDYGEYR$&")); //签名:选择使用算法和使用密钥
System.out.println(token);
}
生成令牌:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
.eyJleHAiOjE2NjA1MjYzNDYsInVzZXJJZCI6MjEsInVzZXJuYW1lIjoieGlhb2hlaSJ9
.IcE_KOp6xUVgpfuERR75OwdqamiuXbMBlhVYaAg6BMA
3. JWT验证对象
@Test
void testJWT1() {
// 创建验证对象
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("!FDYGEYR$&")).build(); // 选择使用算法,通过build生成JWT验证对象
DecodedJWT decodedJWT = jwtVerifier.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9" +
".eyJleHAiOjE2NjA1MjYzNDYsInVzZXJJZCI6MjEsInVzZXJuYW1lIjoieGlhb2hlaSJ9" +
".IcE_KOp6xUVgpfuERR75OwdqamiuXbMBlhVYaAg6BMA"); //使用JWT验证对象验证token
System.out.println("header:" + decodedJWT.getHeader()); // 得到token中的header
System.out.println("payload:" + decodedJWT.getPayload()); // 得到token中的payload
System.out.println("signature:" + decodedJWT.getSignature()); // 得到token中的signature
System.out.println("token:" + decodedJWT.getToken()); // 得到整个token
System.out.println("userId:" + decodedJWT.getClaim("userId")); // 通过 key 得到 payload 中的信息
System.out.println("username:" + decodedJWT.getClaim("username"));
System.out.println("payload中封装的数据:" + decodedJWT.getClaims()); // 得到 payload 中的所有信息
System.out.println("过期时间ExpireAt:" + decodedJWT.getExpiresAt()); // 得到过期时间
}
图示:
4. JWTUtils简单工具类
package com.example.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
public class JWTUtils {
/**
* 签名,由于生成token和解签时都需要使用sign,所以作为成员变量。
*/
private static final String SIGN = "$%!FDGS^@G!GF!AFDSF&%^F";
private JWTUtils() {
}
/**
* 生成token header.payload.signature
* @param map 用户信息,以 Map<String, String> 类型封装
* @return token字符串
*/
public static String getToken(Map<String, String> map) {
Calendar instance = Calendar.getInstance();
instance.add(Calendar.DATE, 7); // 默认7天过期
//创建 JWTBuilder
JWTCreator.Builder builder = JWT.create();
//header不写则使用默认值
// payload
map.forEach((k, v) -> {
builder.withClaim(k, v);
});
String token = builder
.withExpiresAt(instance.getTime()) //过期时间
.sign(Algorithm.HMAC256(SIGN)); //签名算法
return token;
}
/**
* 验证token是否合法,若不合法则会抛出异常
* @param token token字符串
*/
public static void verifyToken(String token) {
JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
}
/**
* 获取token的信息,通过调用 DecodedJWT 的 get 方法,可以得到 token 的各种信息
* 该方法也可以和验证 token 方法合并
* @param token token字符串
* @return DecodedJWT
*/
public static DecodedJWT getTokenInfo(String token) {
return JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
}
}