一、JWT 简介
JSON Web Token(缩写 JWT)是一套跨语言、跨域的身份验证标准。JWT 由头部、声明、签名三个部分组成。
头部:声明该 Token 使用什么算法加密(如 HMAC SHA256 或 RSA)。
声明:存储一些信息(如 User ID 等),但不包含敏感信息。
签名:利用头部和声明,以及一个密钥,对 Token 进行签名,从而验证数据完整性。
二、io.jsonwebtoken 简介
io.jsonwebtoken 是一种 Java 库,提供了一组处理 JWT 的类和方法。
io.jsonwebtoken 的核心类是 Jwts,包含了一些静态方法用于创建、解析和验证 JWT。
使用 io.jsonwebtoken 可以轻松创建和验证 JWT,大大简化了 JWT 实现过程。
三、JWT 的生成
下面是使用 io.jsonwebtoken 生成 JWT 的示例代码,假设需要生成一个包含 userID 和 role 的 JWT(签名算法使用 HS256):
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtGenerator {
private static final String SECRET_KEY = "secret";
public String generateToken(Long userId, String role) {
Date now = new Date();
Date expiryDate = new Date(now.getTime() + 3600000);
return Jwts.builder()
.setSubject(Long.toString(userId))
.claim("role", role)
.setIssuedAt(now)
.setExpiration(expiryDate)
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
}
上面的代码中,函数 generateToken 接收 userId 和 role 作为输入,利用 Jwts 工具生成 JWT,其中调用了 Jwts 的 builder 方法,用于设置 JWT 的头部、声明和签名等信息。
四、JWT 的验证
验证 JWT 的过程包括以下步骤:
1、解密 JWT 获取声明信息。
2、通过声明信息验证 JWT 的有效性。
下面是使用 io.jsonwebtoken 验证 JWT 的示例代码:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
public class JwtValidator {
private static final String SECRET_KEY = "secret";
public boolean validateToken(String token, Long userId) {
Claims claims = Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody();
Long tokenUserId = Long.parseLong(claims.getSubject());
return tokenUserId.equals(userId);
}
}
上述代码中,函数 validateToken 接收 JWT 和 userId(这里只验证 userId)作为输入,利用 Jwts 工具将参数 token 解密,并获取 Token 中的声明信息。
获取声明信息后,可以利用其中的 userId 进行验证操作,即判断是否与传入的 userId 相同。
五、高级用法
io.jsonwebtoken 提供了丰富的 API,除了上述基本用法,还可以进行以下高级用法:
1、设置自定义的 Header 信息,以及增加自定义的声明信息。
2、设置 Token 的有效期。
3、使用非对称加密算法(例如 RSA),提高 Token 的安全性。
4、从 Token 中获取未经签名的部分信息。
六、小结
使用 io.jsonwebtoken 可以方便地实现 JWT 相关的功能,例如生成、验证和解析 Token,同时提供了很多额外功能,如设置过期时间或使用非对称加密算法。在使用 JWT 的项目中,io.jsonwebtoken 是一种非常值得考虑的 Java 库。