Pregunta

Estoy tratando de analizar y validar un token JWT en Node.js basado en esta muestra (creado en .NET): https://github.com/liveservices/livesdk/blob/master/samples/asp.net/authenticationtokensample/jsonwebtoken.cs

Aquí está mi nodo JS JavaScript que valida el 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);
}

Ahora, lo extraño es que casi funciona. Aquí está la salida de las tres consola. Declaraciones de log:

pEwNPJ+LUHBdvNx631UzdyVhPFUOvFY8jG3x/cP81FE=
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
false

Me parece sospechoso que los hashes sean los mismos, excepto para el +-/_ =

¿Alguien ve mi error? Algo que ver con mi codificación base64.

ACTUALIZAR

Jugué un poco más y parece que hay algo funky con la codificación de Base64 aquí. El siguiente código en el nodo JS:

console.log(signature);
var b = new Buffer(signature, 'base64');
console.log(b.toString('base64'));

rendimientos:

pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
pEwNPJLUHBdvNx631UzdyVhPFUOvFY8jG3xcP81F

Lo que parece muy extraño, ¿verdad?

¿Fue útil?

Solución

Gracias a Timothy Meade por comentar y empujarme en la dirección correcta.

El tipo de búfer de nodo genera base 64 estándar con +, / y =

Hay una codificación de Base de URL Safe como se menciona aquí: http://en.wikipedia.org/wiki/base64

Reemplaza + con -, / con _ y = es opcional. El token que se pasa en la Queristing (D'Uh) es una versión segura de URL. De ahí la diferencia.

El código fue arreglado por un simple:

out = out.replace('+','-').replace('/','_').replace('=','');

Otros consejos

Escribí esta biblioteca hace un tiempo, supongo que puedes usar parte del código. Se supone que se ejecuta tanto en Node.js como en un navegador moderno.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top