Convalidamento di un jwt in node.js
-
28-10-2019 - |
Domanda
Sto cercando di analizzare e convalidare un token JWT in Node.js in base a questo campione (scritto in .NET): https://github.com/liveservices/livesdk/blob/master/samples/asp.net/authenticationtokensample/jsonwebtoken.cs
Ecco il mio nodo js javascript che convalida il 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);
}
Ora, la cosa molto strana è: funziona quasi. Ecco l'output delle tre dichiarazioni Console.log:
pEwNPJ+LUHBdvNx631UzdyVhPFUOvFY8jG3x/cP81FE=
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
false
Mi sembra sospetto che gli hash siano entrambi gli stessi tranne il +-/_ =
Qualcuno individua il mio errore? Qualcosa a che fare con la mia codifica di base64.
AGGIORNARE
Ho suonato un po 'di più e sembra che ci sia qualcosa di funky con la codifica di base64 qui. Il seguente codice nel nodo JS:
console.log(signature);
var b = new Buffer(signature, 'base64');
console.log(b.toString('base64'));
rendimenti:
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
pEwNPJLUHBdvNx631UzdyVhPFUOvFY8jG3xcP81F
Che sembra molto strano, giusto?
Soluzione
Grazie a Timothy Meade per aver commentato e spinto nella giusta direzione.
Il tipo di buffer del nodo genera Base64 standard con +, / e =
C'è una codifica Base64 sicura URL come menzionato qui: http://en.wikipedia.org/wiki/base64
Sostituisce + con -, / con _ e = è facoltativo. Il token che viene passato al Querystring (D'Uh) è una versione sicura dell'URL. Da qui la differenza.
Il codice è stato risolto da un semplice:
out = out.replace('+','-').replace('/','_').replace('=','');
Altri suggerimenti
Ho scritto questa biblioteca qualche tempo fa, immagino che tu possa usare un po 'di codice. Dovrebbe funzionare in entrambi i browser moderni.