web-dev-qa-db-fra.com

Les octets de clé ne peuvent être spécifiés que pour les signatures HMAC. Veuillez spécifier une instance PublicKey ou PrivateKey

J'essaie de lire un jeton Web Json (JWT) généré à partir du jeton d'identification de Google OpenID Connect afin d'obtenir les revendications et de vérifier en utilisant la bibliothèque jjwt . J'ai essayé plusieurs façons de le réparer avec le code ci-dessous.


 String publicKeyFromJsonFile = "-----BEGIN PUBLIC KEY-----xxxxxxx-----END PUBLIC KEY-----"

 Claims claims = Jwts.parser()
                .setSigningKey(publicKeyFromJsonFile)
                .parseClaimsJws(jwt).getBody();

 System.out.println(claims);


mais j'obtiens cette erreur:

Java.lang.IllegalArgumentException: Key bytes can only be specified for HMAC signatures. Please specify a PublicKey or PrivateKey instance

Quelle pourrait être la bonne approche à suivre?

3
John Erbynn

Je pense que j'ai été en mesure de résoudre le problème en analysant la clé publique comme un RSAPublicKey. Vous trouverez ci-dessous les détails de la façon dont j'ai procédé.

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

J'espère que ça aide :).

3
John Erbynn

Une bonne approche peut être d'utiliser la page Web JWT.IO pour valider le jeton manuellement - comme décrit dans mon article - puis à appliquer le code équivalent - bien que mon code soit NodeJS.

Vous souhaitez savoir comment vous en venez à valider manuellement un jeton d'identification - pourriez-vous expliquer quels clients et API sont impliqués - il peut y avoir un moyen plus standard d'atteindre vos objectifs.

1
Gary Archer