Validando un JWT en Node.js
-
28-10-2019 - |
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?
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.