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小时)
// 生成 Token
public static String generateToken(String username) {
return JWT.create()
.withSubject(username) // 主题(用户标识)
.withIssuedAt(new Date()) // 签发时间
.withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION_MS)) // 过期时间
.sign(ALGORITHM); // 签名
}
// 验证并解析 Token
public 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. 生成 Token
String token = JwtUtil.generateToken(request.getUsername());
// 3. 返回 Token
return ResponseEntity.ok()
.body(Collections.singletonMap("token", token));
}
}
4. 关键点说明
密钥配置
- 密钥长度:HMAC256 算法要求密钥至少 256 位(32 字节)。如果密钥不足,会抛出异常。
- 安全存储:建议将密钥存储在环境变量或配置文件中(如
application.yml):jwt: secret: YourSecretKeyHere1234567890 expiration-ms: 3600000
Token 验证
在需要验证 Token 的接口(如过滤器)中调用 verifyToken 方法:
public class JwtFilter extends OncePerRequestFilter {
@Override
protected 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 {
@Bean
public 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 的生成与验证。
更多推荐
所有评论(0)