Class JWTDecoder
用于解析和验证JWT(JSON Web Token)令牌
主要功能: 1. 验证JWT签名的有效性(verify方法) 2. 获取JWT的Payload信息(verifiedPayload方法) 3. 获取JWT的Subject(主题)信息 4. 支持多种签名算法(RSA、EC、EdDSA等)
安全警告: - subject()方法不会验证签名,可能被伪造,不能用于身份认证 - 应该使用verifiedSubject()方法获取经过验证的Subject - 在进行任何权限判断前,必须先调用verify()验证Token
使用示例:
// 正确:验证后使用
if (decoder.verify(token)) {
String subject = decoder.verifiedSubject(token);
// 使用subject进行业务逻辑
}
// ❌ 错误:直接使用未验证的subject
String subject = decoder.subject(token); // 危险!
- Author:
- Kerbores(kerbores@riemann.tech)
-
Constructor Summary
ConstructorsConstructorDescriptionJWTDecoder(com.nimbusds.jose.jwk.JWK jwk, String keyId) 兼容构造器:仅指定密钥与密钥ID,时钟容差使用默认值(60 秒) -
Method Summary
Modifier and TypeMethodDescriptionbooleanisValidTimeClaims(com.nimbusds.jwt.JWTClaimsSet claims, long clockSkewSeconds) 校验 JWT 声明中的有效期(exp / iat / nbf)key(com.nimbusds.jose.JWSAlgorithm jwsAlgorithm) 根据JWS算法获取对应的公钥获取JWT的主题(Subject)信息com.nimbusds.jose.PayloadverifiedPayload(String token) 获取验证后的Payload信息verifiedSubject(String token) 验证并获取主题boolean验证Token的签名与有效期boolean验证Token的签名与有效期
-
Constructor Details
-
JWTDecoder
兼容构造器:仅指定密钥与密钥ID,时钟容差使用默认值(60 秒)- Parameters:
jwk- 用于验证JWT签名的JSON Web KeykeyId- 密钥ID
-
-
Method Details
-
key
根据JWS算法获取对应的公钥支持三种算法类型: 1. RSA算法 - 返回RSA公钥 2. EC算法 - 返回EC公钥 3. EdDSA算法 - 返回OctetKeyPair公钥
- Parameters:
jwsAlgorithm- JWS签名算法- Returns:
- 对应的公钥
- Throws:
IllegalArgumentException- 如果算法不支持
-
verify
验证Token的签名与有效期使用默认时钟容差(
clockSkewSeconds)进行校验- Parameters:
token- JWT Token字符串- Returns:
- true表示签名有效且在有效期内,false表示签名无效或已过期/未生效
-
verify
验证Token的签名与有效期校验规则: 1. 签名必须有效 2.
exp缺失直接拒绝(防止"永不过期"的 Token) 3. 当前时间不能超过exp(允许 clockSkewSeconds 秒的时钟偏差) 4. 当前时间不能早于nbf(未生效的 Token 拒绝) 5. 当前时间不能早于iat(签发时间在未来的 Token 拒绝)格式非法/验签失败的 Token 统一返回 false(不抛异常),与
JwksJWTGenerator#verify行为一致- Parameters:
token- JWT Token字符串clockSkewSeconds- 允许的时钟偏差(秒),0 表示不允许偏差- Returns:
- true表示签名有效且在有效期内,false表示无效(含格式非法/签名无效/过期/未生效)
-
isValidTimeClaims
public boolean isValidTimeClaims(com.nimbusds.jwt.JWTClaimsSet claims, long clockSkewSeconds) 校验 JWT 声明中的有效期(exp / iat / nbf)校验规则: 1.
exp缺失直接拒绝(防止"永不过期"的 Token) 2. 当前时间不能超过exp(允许 clockSkewSeconds 秒的时钟偏差) 3. 当前时间不能早于nbf(未生效的 Token 拒绝) 4. 当前时间不能早于iat(签发时间在未来的 Token 拒绝;iat 缺失放行,为可选声明)供子类(如
JwksJWTGenerator)在自定义验签逻辑后复用,保证有效期校验单一来源- Parameters:
claims- JWT 声明集clockSkewSeconds- 允许的时钟偏差(秒),0 表示不允许偏差- Returns:
- true 表示处于有效期内
-
verifiedPayload
获取验证后的Payload信息先验证签名与有效期,验证通过后返回Payload;格式非法/验证失败返回null(不抛异常)
- Parameters:
token- JWT Token字符串- Returns:
- 验证通过的Payload,如果验证失败返回null
-
subject
获取JWT的主题(Subject)信息安全警告: 此方法仅解析JWT的Payload部分并提取Subject字段,不会验证JWT签名的有效性。 这意味着:
- 攻击者可以伪造任意JWT token,此方法仍会返回伪造的Subject
- 过期的、被篡改的、无效的token都能被此方法解析
- 绝对不能将此方法返回的Subject用于身份认证或权限判断
适用场景:
- 日志记录:记录请求的token信息用于审计
- 调试分析:查看token内容但不做信任决策
- 配合其他验证机制:在已有其他安全验证的情况下使用
不适用场景:
- ❌ 用户身份认证:请使用
verifiedSubject(String) - ❌ 权限判断:请先调用
verify(String)验证token - ❌ 任何需要信任token内容的场景
推荐做法:
// 正确:使用验证后的subject String subject = decoder.verifiedSubject(token); if (subject != null) { // 使用subject进行业务逻辑 } // ❌ 错误:直接使用未验证的subject String subject = decoder.subject(token); // 危险!可能被伪造- Parameters:
token- JWT token字符串- Returns:
- Subject字段值,如果token格式错误则抛出异常
- Throws:
RuntimeException- 当token格式不正确时抛出- See Also:
-
verifiedSubject
-