我正在尝试使用以下代码解码和验证我的服务中的 JWT token :
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.
我也尝试过创建公钥,但没有成功。 谁能说明我缺少什么?
最佳答案
看起来您是 JJWT,试图解码 JWT。你从哪里得到公钥?
您应该首先构建一个 PublicKey
,然后将其传入,而不是将公钥作为字符串传递。如果您有权访问 key 的指数和模数:
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解释了如何从字符串构建它,但您必须确保字符串的格式正确。
如果您有兴趣,这里有更多 detailed post that I wrote关于如何使用 JJWT 验证和解析由授权服务器签名的 JWT。
关于java - JWT 验证失败 : Key bytes cannot be specified for RSA signatures. 请指定 PublicKey 或 PrivateKey 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62323624/