我正在尝试使用以下代码来解码和验证服务中的JWT令牌:

String  jwtSecret= "my_key";
Claims claims = Jwts.parser()
        .setSigningKey(jwtSecret)
        .parseClaimsJws(jwt).getBody();
return claims;


上面的代码不起作用,并引发以下异常:

java.lang.IllegalArgumentException: Key bytes cannot be specified for RSA signatures.  Please specify a PublicKey or PrivateKey instance.


我也尝试过创建公钥,但是没有用。
谁能说我想念的东西?

最佳答案

看来您是尝试解码JWT的JJWT。您从哪里获得公钥?

而不是将公共密钥作为字符串传递,应首先构建PublicKey,然后将其传递。如果可以访问密钥的指数和模数:

BigInteger modulus = new BigInteger(1, Base64.getUrlDecoder().decode(key.getN()));

BigInteger exponent = new BigInteger(1, Base64.getUrlDecoder().decode(key.getE()));

RSAPublicKeySpec publicSpec = new RSAPublicKeySpec(modulus, exponent);
KeyFactory factory = KeyFactory.getInstance("RSA");
return factory.generatePublic(publicSpec);


如果没有,this post解释了如何从字符串构建它,但是必须确保该字符串的格式正确。

如果您有兴趣,这里还有更多关于如何验证和解析由授权服务器使用JJWT签名的JWT的detailed post that I wrote

10-07 16:09