Java-jwt4.4.0版本使用

在 Spring Boot 中使用 Auth0 的 java-jwt 4.4.0 版本生成 JWT Token 的步骤如下:


1. 添加依赖

确保 pom.xml 中添加 java-jwt 依赖:

<dependency>
    <groupId>com.auth0groupId>
    <artifactId>java-jwtartifactId>
    <version>4.4.0version>
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. 注意事项

  1. 密钥安全:不要硬编码密钥,建议通过 @Value 从配置文件注入:
    @Value("${jwt.secret}")
    private String secret;
    
  2. Token 传输:通过 HTTPS 传输 Token,避免中间人攻击。
  3. 注销机制:JWT 无状态,若需实现注销,可通过以下方式:
    • 短期 Token + 刷新 Token 机制。
    • 维护服务端 Token 黑名单(需额外存储)。
  4. 异常处理:捕获 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 的生成与验证。

你可能感兴趣的:(java)