Проверка JWT в node.js - PullRequest
       35

Проверка JWT в node.js

4 голосов
/ 15 января 2012

Я пытаюсь проанализировать и проверить токен 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

Что кажется очень странным, верно?

Ответы [ 2 ]

3 голосов
/ 15 января 2012

Спасибо Тимоти Миду за то, что он прокомментировал и подтолкнул меня в правильном направлении.

Тип буфера узла генерирует стандартный Base64 с +, / и =

Существует URL-код безопасной base64, как упомянуто здесь: http://en.wikipedia.org/wiki/Base64

Он заменяет + на -, / на _ и = необязательно. Маркер, который передается в QueryString (d'uh), является безопасной версией URL. Отсюда и разница.

Код был исправлен простым:

out = out.replace('+','-').replace('/','_').replace('=','');
1 голос
/ 24 августа 2012

Я написал эту библиотеку некоторое время назад, я думаю, вы можете использовать часть кода.Предполагается, что он будет работать как в файле node.js, так и в современном браузере.

...