2012-01-15 4 views
3

Я пытаюсь разобрать и проверить маркер JWT в Node.js на основе этого образца (автор в .NET): https://github.com/liveservices/LiveSDK/blob/master/Samples/Asp.net/AuthenticationTokenSample/JsonWebToken.csПроверка на JWT в node.js

Вот мой узла Javascript, что расслоение плотной Подтверждает токен:

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.

UPDATE

Я играл немного и там, кажется, что-то в стиле фанк происходит с base64 кодирования здесь. Следующий код в узле ЯШ:

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

выходы:

pEwNPJ-LUHBdvNx631UzdyVhPFUOvFY8jG3x_cP81FE 
pEwNPJLUHBdvNx631UzdyVhPFUOvFY8jG3xcP81F 

Что выглядит очень странно, правда?

+1

Это может быть функция HMAC этого узла выводит веб или URL безопасный хэш и остальная часть вашего кода является правильным. –

+0

Что-то вроде этого, я только что обновил – ConfusedNoob

ответ

2

Спасибо Timothy Meade за то, что он комментировал и толкал меня в правильном направлении.

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

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

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

Код фиксировалась простой:

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

Старое сообщение, но все же. Ваш код не заменит все вхождения. 'out = out.replace (/ \ +/g, '-'). Replace (/ \ // g, '_'). Replace (/ =/g, '');' будет работать, хотя :) –

+0

replace (/ =/g, '') заменяет все равнозначные символы, даже если они не находятся в конце строки –

1

Я написал эту библиотеку некоторое время назад, я думаю, вы можете использовать некоторые из кода. Он должен работать как в узлах .js, так и в современном браузере.

 Смежные вопросы

  • Нет связанных вопросов^_^