Я пытаюсь проанализировать и проверить токен JWT в node.js на основе этого примера (созданного в .NET): https://github.com/liveservices/LiveSDK/blob/master/Samples/Asp.net/AuthenticationTokenSample/JsonWebToken.cs
Вот мой js-скрипт js для моего узла, который проверяет токен:
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);
}
Теперь, очень странная вещь - это почти работает.Вот вывод трех операторов console.log:
pEwNPJ+LUHBdvNx631UzdyVhPFUOvFY8jG3x/cP81FE=
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
false
Мне кажется подозрительным, что оба хэша одинаковы, за исключением + - / _ =
Кто-нибудь заметит мою ошибку?Что-то связанное с моей кодировкой base64.
ОБНОВЛЕНИЕ
Я играл еще немного, и здесь, кажется, что-то происходит с кодировкой base64.Следующий код в узле js:
console.log(signature);
var b = new Buffer(signature, 'base64');
console.log(b.toString('base64'));
приводит к:
pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE
pEwNPJLUHBdvNx631UzdyVhPFUOvFY8jG3xcP81F
Что кажется очень странным, верно?