一、JWT的基础知识
JWT包含三个部分:头部、载荷和签名。头部指定算法类型和签名类型。常用的算法有:HMAC、RSA和ECDSA。载荷包含一些声明,例如:发布者、过期时间、主题、受众等。签名是由头部和载荷使用指定的算法生成的,可以验证消息是否被篡改。当客户端向服务器发送请求时,它应发送JWT作为 Authorization 头的值。
二、使用Java JWT实现JWT生成和验证
使用Java JWT库可以方便地生成和验证JWT。以下是生成JWT的示例代码:
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.UUID; public class JWTGenerator { public static String generateToken(String issuer, String subject, long ttlMillis, Mapclaims) { long nowMillis = System.currentTimeMillis(); Date now = new Date(nowMillis); // 使用随机数作为JWT的ID String jwtId = UUID.randomUUID().toString(); JwtBuilder builder = Jwts.builder() .setId(jwtId) .setIssuedAt(now) .setSubject(subject) .setIssuer(issuer) .claim("data", claims) .signWith(SignatureAlgorithm.HS256, "secret"); if (ttlMillis >= 0) { long expMillis = nowMillis + ttlMillis; Date exp = new Date(expMillis); builder.setExpiration(exp); } return builder.compact(); } }
使用Java JWT库验证JWT非常简单。下面是一个示例代码:
import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; public class JWTVerifier { public static Claims verifyToken(String jwtToken) { Claims claims = Jwts.parser() .setSigningKey("secret") .parseClaimsJws(jwtToken) .getBody(); return claims; } }
三、使用JWT实现无状态认证和授权功能
通常,使用JWT的有状态应用程序可以使用JWT来实现无状态RESTful API认证。以下是一个实现JWT认证和授权的示例代码:
import io.jsonwebtoken.Claims; import io.jsonwebtoken.JwtException; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Arrays; import java.util.Date; import java.util.List; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.core.MultivaluedHashMap; import javax.ws.rs.core.MultivaluedMap; public class JWTFilter { // 在这里替换成您的密钥 private static final String SECRET = "mySecretKey"; public void filter(ContainerRequestContext requestContext) throws JwtException { // 从头部获取JWT MultivaluedMapheaders = requestContext.getHeaders(); List authHeader = headers.get("Authorization"); if (authHeader == null || authHeader.isEmpty()) { throw new JwtException("Missing or invalid authorization header"); } String jwtToken = authHeader.get(0).split(" ")[1]; // 如果token验证不成功则不会添加security context if (isTokenValid(jwtToken)) { // 获取JWT中的声明信息 Claims claims = JWTVerifier.verifyToken(jwtToken); // 获取JWT中用户数据 String user = claims.getSubject(); // 添加用户身份到请求属性中 requestContext.setProperty("user", user); // 添加角色信息到请求属性列表 String roles = (String) claims.get("roles"); List roleList = Arrays.asList(roles.split(",")); requestContext.setProperty("roles", roleList); } } private boolean isTokenValid(String jwtToken) { boolean isValid = false; try { Claims claims = Jwts.parser() .setSigningKey(SECRET) .parseClaimsJws(jwtToken) .getBody(); Date now = new Date(); if (now.before(claims.getExpiration())) { isValid = true; } } catch (Exception e) { isValid = false; throw new JwtException("Invalid JWT token"); } return isValid; } }
四、小结
在本文中,我们学习了如何使用Java JWT库实现无状态JWT认证和授权功能。我们了解了JWT的基础知识,并实现了JWT生成和验证方法。我们还提供了一个示例代码来说明如何将JWT用于无状态认证和授权功能。使用JWT可以大大简化身份验证和授权的复杂性,同时提高应用程序的安全性。