You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用org.springframework.security.oauth2.jwt正确解析JWT Claims?

使用Spring Security OAuth2 JWT库解析JWT Claims的正确方式

要解析JWT的Claims,核心是使用JwtDecoder组件(与生成令牌用的JwtEncoder配对),它会自动完成JWT的签名验证、有效期校验、issuer匹配等安全校验,并解析出包含所有Claims的Jwt对象。以下是完整的改造实现:

1. 注入JwtDecoder组件

首先在工具类中注入JwtDecoder,Spring会根据你配置的JWT密钥、issuer等信息自动生成该实例:

@Service
public class JwtUtil {

    public static final String JWT_ISSUER = "test.com";
    public static final long JWT_ACCESS_TOKEN_EXPIRY = 3600L;
    public static final long JWT_REFRESH_TOKEN_EXPIRY = 7200L;

    private final JwtEncoder jwtEncoder;
    private final JwtDecoder jwtDecoder;

    // 构造方法注入两个核心组件
    public JwtUtil(JwtEncoder jwtEncoder, JwtDecoder jwtDecoder) {
        this.jwtEncoder = jwtEncoder;
        this.jwtDecoder = jwtDecoder;
    }

    // 原有createToken、createRefreshToken方法保持不变...
}

2. 实现Claims解析方法

基础解析:验证并获取JWT对象

先实现通用的令牌解析方法,它会自动完成所有安全校验,校验失败会抛出对应的JwtException(比如过期、签名错误等):

// 解析令牌并完成安全校验,返回Jwt对象
private Jwt parseToken(String token) {
    try {
        return jwtDecoder.decode(token);
    } catch (JwtException e) {
        // 根据业务需求处理异常,比如返回无效令牌提示
        throw new RuntimeException("无效的JWT令牌", e);
    }
}

实现extractExpiresAt方法

基于上面的解析方法,提取exp(过期时间)Claim就很简单:

private String extractExpiresAt(String token) {
    Jwt jwt = parseToken(token);
    Instant expiresAt = jwt.getExpiresAt();
    return expiresAt != null ? expiresAt.toString() : null;
}

提取自定义Claims

如果你的令牌包含自定义字段(比如调用createToken时传入的自定义Claims),可以通过以下方法提取:

// 提取单个自定义Claim,支持指定类型
public <T> T extractCustomClaim(String token, String claimName, Class<T> claimType) {
    Jwt jwt = parseToken(token);
    return jwt.getClaim(claimName);
}

// 获取所有Claims(包含标准字段和自定义字段)
public Map<String, Object> extractAllClaims(String token) {
    Jwt jwt = parseToken(token);
    return jwt.getClaims();
}

注意事项

  • 必须依赖JwtDecoder做安全校验:不要手动解码Base64的payload部分(除非是测试场景),跳过校验会导致令牌伪造、过期令牌被滥用等安全问题。
  • 异常处理:JwtDecoder会抛出不同类型的JwtException子类,比如ExpiredJwtException(令牌过期)、InvalidSignatureException(签名错误),你可以根据不同异常类型做针对性处理。

内容的提问来源于stack exchange,提问作者Johnny boy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:01:02