依赖导入
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
概念
JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个 Token,并且该字符串还带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为JSON对象传输
使用
创建Token
// 默认过期时间为 3600 分钟
private static final long EXPIPE_TIME = 3600 * 60 * 1000;
// 加密 Token 的密钥名称
private static final String SECRET = "MiYao";
/**
* 生成签名,五分钟后过期
* 并在 token 创建时,将 userID 也存放至 Token 内
* @param userId
* @return
*/
public static String sign(String userId) {
try {
Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
// JWT 通过 Algorithm.HMAC256(SECRET) 携带的密钥进行加密
Algorithm algorithm = Algorithm.HMAC256(SECRET);
return JWT.create()
// 将 user id 保存到 token 里面
.withAudience(userId)
// 五分钟后token过期
.withExpiresAt(date)
// 添加密钥加密条件
.sign(algorithm);
} catch (Exception e) {
return null;
}
}
/**
* 根据token获取 userId
* @param token
* @return
*/
public static String getUserId(String token) {
try {
// 获取创建token时放置与token内的userID
String userId = JWT.decode(token).getAudience().get(0);
return userId;
} catch (JWTDecodeException e) {
return null;
}
}
校检 Token
// 加密 Token 的密钥名称
private static final String SECRET = "MiYao";
/**
* 校验token
* @param token
* @return
*/
public static boolean checkSign(String token) {
try {
Algorithm algorithm = Algorithm.HMAC256(SECRET);
// 通过密钥进行解密
JWTVerifier verifier = JWT.require(algorithm).build();
/**
* 通过 verifier.verify() 方法检验 token,如果token不符合则抛出异常
*/
DecodedJWT jwt = verifier.verify(token);
return true;
} catch (JWTVerificationException exception) {
return false;
}
}