Почему часть подписи токена jwt всегда отличается, даже если она создается с одинаковыми значениями? - PullRequest
1 голос
/ 24 июня 2019

jsonwebtoken , v8.5.0
узел v10.13.0
нпм 6.4.1

Если я создаю токен несколько раз с помощью:

jwt.sign({ user_email: user_email, user_id: user_id, username: username }, 'RESTFULAPIs')  

Вопрос 01:

Кажется, что первые 2 части строки всегда одинаковы (значения header и payload в base64), но третья часть (signature) отличается.

Почему signature отличается, если исходные значения совпадают?

Что я пробовал:

Я прочитал раздел signature на jwt.io / вводной :

Для создания подписи вам понадобится:

  • кодированный заголовок
  • кодированная полезная нагрузка
  • секрет
  • алгоритм, указанный в заголовке

и подпишите это.

Итак, как предположение:

Является ли signature результатом шифрования кодированных в base64 значений header и payload с использованием алгоритма HS256 и secret, в данном случае это строка RESTFULAPIs, которая создает другой результат каждый раз, когда он шифруется, а декодированный результат всегда одинаков?


Вопрос 02:

Декодированное значение различных токенов всегда одинаково, за исключением свойства объекта с именем iat. Что представляет собой это свойство?

{
iat: 1561358034
user_id: "25423537fshsdgA"
user_email: "info@test.com"
username: "bob"
}

{
iat: 1561358156
user_id: "25423537fshsdgA"
user_email: "info@test.com"
username: "bob"
}

На самом деле, после более подробного изучения второго вопроса я наткнулся на следующее:

Заявка "iat" (выданная в) указывает время, когда JWT был выпущен. Эта претензия может быть использована для определения возраста JWT. это значение ДОЛЖНО быть числом, содержащим значение NumericDate.

Источник: https://tools.ietf.org/html/rfc7519#section-4.1.6

1 Ответ

0 голосов
/ 24 июня 2019

По документам :

Сгенерированные jwts будут включать требование iat (выданное в) по умолчанию, если не указано noTimestamp.Если в полезную нагрузку вставлено iat, оно будет использоваться вместо реальной отметки времени для вычисления других вещей, таких как exp с заданным временным интервалом в options.expiresIn.

Итак, вы можете проверить генерациюнесколько jwts в одну и ту же секунду (что, следовательно, будет иметь одинаковый iat) и убедитесь, что подпись одинакова.Или используйте параметр noTimestamp, который исключит iat и, следовательно, сделает полезные данные идентичными.Я не думаю, что это рекомендуемый способ сделать это.

Но вкратце, iat "выдается на", как вы сами ответили, и полезная нагрузка (и, следовательно, подпись) идетменять каждую секунду при изменении вставленного iat, согласно документам, которые я для вас процитировал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...