JAVA-JWT学习–com.auth0的学习笔记
1. pom.xml关于java-jwt依赖配置
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
2.编写JWT的token生成和验证代码样例
例子中采用的时HMAC265的方式进行加密,其他加密方式可以参考官方github的加密方法去修改。其他的一些接口可以参考官方文档java-jwt API文档的链接
package com.wms.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.exceptions.AlgorithmMismatchException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;
import com.auth0.jwt.exceptions.JWTVerificationException;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
public class JwtUtils {
// 密钥,用于签名和验证JWT
private static final String SECRET = "secret";
// JWT的发行者、主题和受众------------------这部分可以不设置
private static final String ISSUER = "auth0";
private static final String SUBJECT = "1234567890";
private static final String AUDIENCE = "app";
// JWT的有效期(1小时)
private static final Integer EXPIRATION_TIME_IN_HOUR = 1;
// 生成JWT的方法
public static String generateJwt(Integer userId, String userName) {
//初始化实例
JWTCreator.Builder JWTBuilder = JWT.create();
//设置Jwt的发行者 主题 受众 可以不设置
JWTBuilder.withIssuer(ISSUER);
JWTBuilder.withSubject(SUBJECT);
JWTBuilder.withAudience(AUDIENCE);
//设置过期时间 预设一个token过期时间
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR,EXPIRATION_TIME_IN_HOUR);//过期时间为1小时
JWTBuilder.withExpiresAt(calendar.getTime());
//Header
HashMap<String, Object> map = new HashMap<>();
map.put("test", "test");
JWTBuilder.withHeader(map);
//PayLoad
JWTBuilder.withClaim("UserId", userId);
JWTBuilder.withClaim("UserName", userName);
//设置JWT的签发时间
JWTBuilder.withIssuedAt(new Date());
// 设置JWT的生效时间(通常与签发时间相同)
JWTBuilder.withNotBefore(new Date(System.currentTimeMillis()));
// 使用HMAC256算法和SECRET密钥对JWT进行签名
return JWTBuilder.sign(Algorithm.HMAC256(SECRET));
}
// 验证JWT的方法
public static boolean verifyJwt(String token) {
try {
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET))
.withIssuer(ISSUER)
.withSubject(SUBJECT)
.withAudience(AUDIENCE)
.build();// 构建JWTVerifier实例
DecodedJWT jwt = verifier.verify(token);
System.out.println("header"+jwt.getHeader());
System.out.println("payload UserId: " + jwt.getClaim("UserId"));
System.out.println("payload UserName: " + jwt.getClaim("UserName"));
return true; // 验证成功
} catch (JWTVerificationException exception) {
// 处理验证失败
System.out.println("Invalid token: " + exception.getMessage());
return false; // 验证失败
}
}
public static void main(String[] args) {
// 生成JWT
Integer userId = 1;
String userName = "admin";
String token = generateJwt(userId,userName);
System.out.println("Generated Token: " + token);
// 验证JWT
boolean isValid = verifyJwt(token);
System.out.println("Token is valid: " + isValid);
// 测试无效的JWT
String invalidToken = token.substring(0, token.length() - 1) + "X"; // 假设最后一个字符被修改了
boolean isInvalid = verifyJwt(invalidToken);
System.out.println("Invalid Token is valid: " + isInvalid);
}
}
运行结果截图
3.1 验证异常结果抛出
上述的样例中采用的时JWTVerificationException进行抛出,具体的样例抛出设置的类还有如下图所示:
可以根据需要设置不同的异常抛出,然后根据不同的异常进行不同的处理。