2015-08-03 1 views
4

J'utilise jose4j pour valider et traiter un fichier JWT. Le JWT ressemble à ceci et il passe la validation dans la page d'accueil de JWT. enter image description hereClé de vérification pour jose4j JwtConsumer

Cependant, je ne peux pas faire de même en utilisant la bibliothèque jose4j java. L'exception se plaint de la clé de vérification que j'ai définie. Mais il y a plusieurs types de clés définies dans la bibliothèque et je les ai essayées mais pas de chance. Le code est le suivant:

import java.util.Map; 

import org.jose4j.jwt.JwtClaims; 
import org.jose4j.jwt.consumer.InvalidJwtException; 
import org.jose4j.jwt.consumer.JwtConsumer; 
import org.jose4j.jwt.consumer.JwtConsumerBuilder; 
import org.jose4j.keys.HmacKey; 

public class YGJWT { 

    public static void main(String args[]) throws InvalidJwtException { 

     String jwt = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ"; 
     String secret = "secret"; 

     JwtConsumer jwtConsumer = new JwtConsumerBuilder() 
       .setVerificationKey(new HmacKey(secret.getBytes())) //what kind of key do i need to use it here? 
       .build(); 


     JwtClaims jwtClaims = jwtConsumer.processToClaims(jwt); 
     Map<String, Object> claimsMap = jwtClaims.getClaimsMap(); 

     claimsMap.forEach((String key, Object val) -> { 
      System.out.println(key + ": " + val.toString()); 
     }); 

    } 

} 

Toute aide est appréciée.

Répondre

5

Je suppose que vous obtenez une exception quelque chose comme ça? org.jose4j.lang.InvalidKeyException: A key of the same size as the hash output (i.e. 256 bits for HS256) or larger MUST be used with the HMAC SHA algorithms but this key is only 48 bits

Le HmacKey est le type correct pour HS256 mais la clé est techniquement trop court selon le deuxième alinéa de http://tools.ietf.org/html/rfc7518#section-3.2 qui a le même texte que le message d'exception.

Vous pouvez contourner ce problème en créant le JwtConsumer avec .setRelaxVerificationKeyValidation(), ce qui vous permettra de raccourcir les touches. Cela ressemble à ceci (en ajoutant juste une ligne à un extrait de votre exemple):

JwtConsumer jwtConsumer = new JwtConsumerBuilder() 
    .setVerificationKey(new HmacKey(secret.getBytes())) 
    .setRelaxVerificationKeyValidation() // allow shorter HMAC keys when used w/ HSxxx algs 
    .build(); 

En général si j'essayer d'éviter l'utilisation d'un mot de passe court comme clé comme « secret » et suggère d'utiliser une plus forte clé si possible.

+0

Merci Brian, ça résout le problème immédiatement! –

+0

Content de pouvoir vous aider et merci d'utiliser [la bibliothèque jose4j JWT] (https://bitbucket.org/b_c/jose4j/wiki/Home)! –

+0

@BrianCampbell si je peux demander ici -;) Je reçois une exception lorsque j'essaie d'obtenir un jeton JWT ' Causé par: java.security.InvalidKeyException: Aucun fournisseur installé ne prend en charge cette clé: sun.security.rsa.RSAPrivateCrtKeyImpl –