Validation d'un JWT dans node.js
-
28-10-2019 - |
Question
J'essaie d'analyser et de valider un jeton JWT dans node.js basé sur cet exemple (créé en .NET): https://github.com/liveservices/LiveSDK/blob/master/Samples/Asp.net/AuthenticationTokenSample/JsonWebToken.cs
Voici mon node js javascript qui valide le token:
var validateSignature = function(key, claims, envelope, signature) {
var hasher = crypto.createHash('sha256');
hasher.update(key + "JWTSig");
var key = hasher.digest('binary');
var hmac = crypto.createHmac('sha256', key);
hmac.update(envelope + '.' + claims);
var out = hmac.digest('base64');
console.log(out);
console.log(signature);
console.log(out === signature);
}
Maintenant, ce qui est très étrange, c'est que ça marche presque.Voici la sortie des trois instructions console.log:
pEwNPJ+LUHBdvNx631UzdyVhPFUOvFY8jG3x/cP81FE=
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
false
Il me semble suspect que les hachages soient les mêmes sauf pour le + - / _=
Quelqu'un a repéré mon erreur?Quelque chose à voir avec mon encodage base64.
<₹UPDATE
J'ai joué un peu plus et il semble y avoir quelque chose de génial avec l'encodage base64 ici.Le code suivant dans le nœud js:
console.log(signature);
var b = new Buffer(signature, 'base64');
console.log(b.toString('base64'));
donne:
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
pEwNPJLUHBdvNx631UzdyVhPFUOvFY8jG3xcP81F
Ce qui semble très étrange, non?
La solution
Merci à Timothy Meade pour ses commentaires et m'avoir poussé dans la bonne direction.
Le type de tampon de nœud génère la norme Base64 avec +, / et=
Il existe un encodage en base64 sécurisé pour les URL, comme mentionné ici: http://en.wikipedia.org/wiki/ Base64
Il remplace + par -, / par _ et= est facultatif.Le jeton qui est transmis à la QueryString (d'uh) est une version sécurisée pour les URL.D'où la différence.
Le code a été corrigé par un simple:
out = out.replace('+','-').replace('/','_').replace('=','');
Autres conseils
J'ai écrit cette bibliothèque il y a quelque temps, je suppose que vous pouvez utiliser une partie du code.Il est censé fonctionner à la fois dans node.js et dans un navigateur moderne.