Java-jwt4.4.0版本使用
在 Spring Boot 中使用 Auth0 的 java-jwt
4.4.0 版本生成 JWT Token 的步骤如下:
1. 添加依赖
确保 pom.xml
中添加 java-jwt
依赖:
<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>4.4.0</version>
</dependency>
2. 配置 JWT 工具类
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.Date;public class JwtUtil {private static final String SECRET = "YourSecretKeyHere1234567890"; // 密钥(至少256位)private static final Algorithm ALGORITHM = Algorithm.HMAC256(SECRET); // 使用 HMAC256 算法private static final long EXPIRATION_MS = 3600000; // Token 有效期(1小时)// 生成 Tokenpublic static String generateToken(String username) {return JWT.create().withSubject(username) // 主题(用户标识).withIssuedAt(new Date()) // 签发时间.withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION_MS)) // 过期时间.sign(ALGORITHM); // 签名}// 验证并解析 Tokenpublic static String verifyToken(String token) {DecodedJWT jwt = JWT.require(ALGORITHM).build().verify(token); // 自动验证过期时间和签名return jwt.getSubject(); // 返回用户名}
}
3. 使用示例
在登录接口中生成 Token:
@RestController
@RequestMapping("/api/auth")
public class AuthController {@PostMapping("/login")public ResponseEntity<?> login(@RequestBody LoginRequest request) {// 1. 验证用户名密码(此处省略具体逻辑)// 2. 生成 TokenString token = JwtUtil.generateToken(request.getUsername());// 3. 返回 Tokenreturn ResponseEntity.ok().body(Collections.singletonMap("token", token));}
}
4. 关键点说明
密钥配置
- 密钥长度:HMAC256 算法要求密钥至少 256 位(32 字节)。如果密钥不足,会抛出异常。
- 安全存储:建议将密钥存储在环境变量或配置文件中(如
application.yml
):jwt:secret: YourSecretKeyHere1234567890expiration-ms: 3600000
Token 验证
在需要验证 Token 的接口(如过滤器)中调用 verifyToken
方法:
public class JwtFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) {String token = request.getHeader("Authorization");if (token != null && token.startsWith("Bearer ")) {token = token.substring(7);try {String username = JwtUtil.verifyToken(token);// 将用户信息存入 SecurityContext} catch (Exception e) {response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid Token");}}chain.doFilter(request, response);}
}
5. 整合 Spring Security
若项目中使用了 Spring Security,需配置过滤器和放行规则:
@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().antMatchers("/api/auth/login").permitAll() // 放行登录接口.anyRequest().authenticated().and().addFilterBefore(new JwtFilter(), UsernamePasswordAuthenticationFilter.class);return http.build();}
}
6. 注意事项
- 密钥安全:不要硬编码密钥,建议通过
@Value
从配置文件注入:@Value("${jwt.secret}") private String secret;
- Token 传输:通过 HTTPS 传输 Token,避免中间人攻击。
- 注销机制:JWT 无状态,若需实现注销,可通过以下方式:
- 短期 Token + 刷新 Token 机制。
- 维护服务端 Token 黑名单(需额外存储)。
- 异常处理:捕获
JWTVerificationException
处理过期或非法 Token。
7. 测试 Token
生成 Token 后,可通过 JWT.io 解码验证内容,或使用 curl
测试接口:
curl -X POST http://localhost:8080/api/auth/login \-H "Content-Type: application/json" \-d '{"username": "user", "password": "password"}'
响应示例:
{"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyIiwiaWF0IjoxNjkzMjYwMDAwLCJleHAiOjE2OTMyNjM2MDB9.abcdef1234567890"
}
通过以上步骤,即可在 Spring Boot 中基于 java-jwt
4.4.0 实现 JWT 的生成与验证。