在当今的前后端分离架构中,JWT(JSON Web Token)已成为身份认证的主流方案。今天,我们将通过一个简洁的JWT工具类,深入理解Token的生成与解析原理。
一、JWT简介
JWT是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输JSON格式的信息。一个JWT通常由三部分组成:
- Header(头部)
- Payload(负载)
- Signature(签名)
二、工具类源码解析
让我们来看一个基于java-jwt库实现的工具类:
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import java.util.Date;
import java.util.Map;
public class JwtUtil {
// 签名密钥,实际项目中应配置在配置文件或环境变量中
private static final String KEY = "test";
/**
* 生成JWT Token
* @param claims 业务数据(用户信息等)
* @return 签名的JWT字符串
*/
public static String genToken(Map<String, Object> claims) {
return JWT.create()
.withClaim("claims", claims) // 设置自定义数据
.withExpiresAt(new Date(System.currentTimeMillis() + 1000 60 60 * 12)) // 12小时过期
.sign(Algorithm.HMAC256(KEY)); // HMAC256算法签名
}
/**
* 解析验证JWT Token
* @param token JWT字符串
* @return 业务数据
*/
public static Map<String, Object> parseToken(String token) {
return JWT.require(Algorithm.HMAC256(KEY))
.build()
.verify(token) // 验证签名和过期时间
.getClaim("claims") // 获取claims字段
.asMap(); // 转换为Map对象
}
}三、核心功能详解
1. Token生成(genToken方法)
关键点说明:
- withClaim("claims", claims):将业务数据存储在JWT的payload中
- withExpiresAt():设置过期时间,这里是12小时
- sign(Algorithm.HMAC256(KEY)):使用HMAC256算法和密钥进行签名
2. Token解析(parseToken方法)
工作流程:
1. require(Algorithm.HMAC256(KEY)):指定验证算法和密钥
2. verify(token):验证签名有效性和是否过期
3. getClaim("claims"):提取存储的业务数据
4. asMap():将数据转换为Map格式
四、使用示例
生成Token
// 创建用户信息
Map<String, Object> claims = new HashMap<>();
claims.put("userId", 1001);
claims.put("username", "zhangsan");
claims.put("role", "admin");
// 生成Token
String token = JwtUtil.genToken(claims);
System.out.println("生成的Token: " + token);解析Token
try {
// 解析Token
Map<String, Object> userInfo = JwtUtil.parseToken(token);
System.out.println("用户ID: " + userInfo.get("userId"));
System.out.println("用户名: " + userInfo.get("username"));
} catch (Exception e) {
System.out.println("Token无效或已过期: " + e.getMessage());
}五、最佳实践建议
1. 密钥管理:不要将密钥硬编码在代码中,建议使用配置文件或环境变量
2. 过期时间设置:根据业务需求设置合理的过期时间,一般建议2-24小时
3. 异常处理:解析Token时需捕JWTVerificationException异常
4. HTTPS传输:生产环境务必使用HTTPS防止Token被截获
六、依赖配置
pom.xml中添加依赖:
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>七、总结
这个JWT工具类虽然代码量少,但涵盖了JWT的核心功能:生成带业务数据的Token,并能够验证解析。在实际项目中,我们可以基于此类构建完整的认证拦截器,实现无状态的身份认证。
JWT的无状态特性使其非常适合微服务和分布式系统,但也需要注意Token注销和续期等问题。希望这个工具类能帮助你在项目中快速集成JWT认证功能!