JWT signature ne correspond pas localement calculée signature
Je suis en utilisant
JwtBuilder builder = Jwts.builder()
.setId(user.getEmail())
.signWith(signatureAlgorithm, signingKey);
créer un jeton puis
Jwts.parser().setSigningKey(secret).parse(token);
pour s'authentifier. Lorsque je l'exécute dans un test Unitaire, il fonctionne très bien. Cependant, quand je authentifier jeton passé comme un en-tête sur appel RESTE, l'authentification échoue avec SignatureException. J'ai vérifié le jeton sur les deux extrémités de l'appel HTTP et la chaîne de jeton est identique. Code pour créer et/ou authentifier est statique, donc, le secret est de même de chaque côté.
- Pourriez-vous poster un exemple de jeton et la clé secrète?
- statique de la Clé secrète = MacProvider.generateKey(); SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; byte[] apiKeySecretBytes = secret.getEncoded(); Clé signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
Vous devez vous connecter pour publier un commentaire.
static Key secret = MacProvider.generateKey();
va générer une nouvelle clé aléatoire à chaque fois que votre serveur est rechargé, parce que les variables statiques sont initialisés lorsque la classe est chargéeCela signifie que si vous exécutez une JWT, il n'est valable que tant que le serveur ne redémarre pas. Le
SignatureException
vous avez raison en est que la clé de signature, c'est différentVous avez besoin pour stocker la clé de signature
secret.getEncoded()
après la première génération et de la charge lorsque votre module commenceSystem.out.println(DatatypeConverter.printHexBinary(secret.getEncoded()))
J'ai eu un problème similaire. Dans mon cas, c'était faux jeton de validation. J'ai mis le signe octets:
Mais quand j'ai été l'analyse de la symbolique et de réglage signKey je programmés comme une Chaîne de caractères, pas des octets:
Également toujours vérifier les citations et les espaces lors de la vérification de jeton, il peut souvent être l'excès de l'espace/citation dans le début/la fin du jeton (utiliser trim () (méthode)
J'ai eu le même problème, j'ai remarqué que dans les sources à chaque fois qu'ils convertir la clé de signature de l'-ils explicitement spécifier l'encodage UTF-8. J'ai essayé de changer l'encodage alors que les deux décodage du jeton:
Et lors de la signature du jeton:
C'est la seule chose qui fixe cela pour moi.
J'ai eu un problème similaire. Dans mon cas, les deux clés où le même, mais pour certaines raisons, j'avais reçu un jeton à l'intérieur des guillemets (e.g
"Syasda.da3das.aDjty6"
au lieu de simplementSyasda.da3das.aDjty6
).Il m'a fallu beaucoup de temps pour réaliser cela, car la plupart du temps lors de tests sur jwt.oi, je voudrais juste copier le jeton manuellement sans les crochets afin de le vérifier.
La suppression de ces citations résolu le problème pour moi. J'espère que cela aidera quelqu'un d'autre aussi.
J'ai résolu le problème en modifiant l'HÔTE de l'URL du point de terminaison REST. Il avait un mauvais hôte qui a renvoyé l'erreur HTTP 401 non autorisé.