web-dev-qa-db-ja.com

キーバイトは、HMAC署名に対してのみ指定できます。 PublicKeyまたはPrivateKeyインスタンスを指定してください

クレームを取得して jjwt ライブラリを使用して確認するために、Google OpenID ConnectのIdトークンから生成されたJson Web Token(JWT)を読み取ろうとしています。以下のコードで修正するためにいくつかの方法を試しました。


 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

従うべき正しいアプローチは何ですか?

3
John Erbynn

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();
        }

それが役に立てば幸い :)。

3
John Erbynn

JWT.IO Webページを使用してトークンを手動で検証することをお勧めします- my article -次に 同等のコードを適用 -に記載されていますが、私のコードはNodeJS。

Idトークンを手動で検証する方法に興味があります-関係するクライアントとAPIを説明できますか-目標を達成するためのより標準的な方法があるかもしれません。

1
Gary Archer