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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top