我正在尝试读取从 Google OpenID Connect 的 Id token 生成的 Json Web token (JWT),以获取声明并使用 jjwt 进行验证图书馆。我尝试了几种方法来使用下面的代码修复它。
String publicKeyFromJsonFile = "-----BEGIN PUBLIC KEY-----xxxxxxx-----END PUBLIC KEY-----"
Claims claims = Jwts.parser()
.setSigningKey(publicKeyFromJsonFile)
.parseClaimsJws(jwt).getBody();
System.out.println(claims);
但我收到此错误:
java.lang.IllegalArgumentException: Key bytes can only be specified for HMAC signatures. Please specify a PublicKey or PrivateKey instance
请遵循什么是正确的方法?
最佳答案
我想我已经能够通过将 publicKey 解析为 RSAPublicKey
来解决问题。 .下面是我如何去做的细节。
public static Optional<RSAPublicKey> getParsedPublicKey(){
// public key content...excluding '---PUBLIC KEY---' and '---END PUBLIC KEY---'
String PUB_KEY =System.getenv("PUBLIC_KEY") ;
// removes white spaces or char 20
String PUBLIC_KEY = "";
if (!PUB_KEY.isEmpty()) {
PUBLIC_KEY = PUB_KEY.replace(" ", "");
}
try {
byte[] decode = com.google.api.client.util.Base64.decodeBase64(PUBLIC_KEY);
X509EncodedKeySpec keySpecX509 = new X509EncodedKeySpec(decode);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(keySpecX509);
return Optional.of(pubKey);
} catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
e.printStackTrace();
System.out.println("Exception block | Public key parsing error ");
return Optional.empty();
}
希望能帮助到你 :)。
关于java - 只能为 HMAC 签名指定 key 字节。请指定一个 PublicKey 或 PrivateKey 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60038550/