在使用 JWT 进行认证和授权时,有时候可能会遇到 "io.jsonwebtoken.UnsupportedJwtException: Signed Claims JWSs are not supported." 异常。本文将介绍该异常的原因以及如何解决它。
原因
这个异常是由于使用了签名的 JWT(JWS),而 io.jsonwebtoken
库不支持这种方式导致的。当使用 parseClaimsJwt
方法解析带有签名的 JWT 时,它将忽略签名并且返回包含荷载(payload)的 Claims
对象。这会导致验证 JWT 的签名失败,并抛出异常。
解决方法
使用 parseClaimsJws
方法代替 parseClaimsJwt
方法,即可解决
private Claims getClaimsFormToken(String token) {
Claims claims = null;
try {
claims = Jwts.parser()
.setSigningKey(secret)
// 将 parseClaimsJwt 替换为 parseClaimsJws
.parseClaimsJws(token)
.getBody();
}catch (Exception e){
e.printStackTrace();
}
return claims;
}
parseClaimsJws
与 parseClaimsJwt
的异同
- 相同
parseClaimsJwt
和parseClaimsJws
两个方法的作用是一样的,都是解析 JWT 载荷并返回一个Claims
对象。
- 不同
parseClaimsJwt
方法适用于未签名的 JWT。parseClaimsJws
方法适用于带有 JWS 签名的 JWT。
- 应用场景:据所使用的 JWT 类型选择正确的方法来解析它
- 如果您使用的是带有 JWS 签名的 JWT,则必须使用
parseClaimsJws
方法才能正确解析 JWT 并验证签名。 - 如果使用的是未签名的 JWT,则可以使用
parseClaimsJwt
方法;
- 如果您使用的是带有 JWS 签名的 JWT,则必须使用