Ключевые байты могут быть указаны только для подписей HMA C. Пожалуйста, укажите экземпляр PublicKey или PrivateKey - PullRequest
2 голосов
/ 03 февраля 2020

Я пытаюсь прочитать Json Web Token (JWT), сгенерированный из Id Token Google OpenID Connect, чтобы получить утверждения и проверить с помощью библиотеки 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

Пожалуйста, какой может быть правильный подход?

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Я думаю, что смог исправить ошибку, проанализировав 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();
        }

Надеюсь, это поможет:).

0 голосов
/ 03 февраля 2020

Хорошим подходом может быть использование веб-страницы JWT.IO для проверки токена вручную - как описано в моей статье - затем к применяется эквивалентный код - хотя мой код NodeJS.

Интересует, как вы можете вручную проверять токен id - могли бы вы объяснить, какие клиенты и API задействованы - может быть более стандартный способ достижения ваших целей.

...