我正在尝试使用以下代码来解码和验证服务中的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。