Генерация претензии JTI для JWT в JavaScript - PullRequest
0 голосов
/ 24 октября 2018

Я спрашиваю об этом, так как коллега застрял на этом в течение нескольких дней.Проблема в том, что он пытается использовать утверждение JTI в своем JWT, но, похоже, не может понять, как его правильно сгенерировать.Нигде мы не можем найти четкого и прямого объяснения того, как генерировать и форматировать JTI, если это вообще необходимо.Мы были бы признательны, если бы кто-то мог прояснить для нас вещи.

ОБНОВЛЕНИЕ: Это пример используемого кода

var randomNumber1 = Math.floor(Math.random() * Math.floor(254));
var randomText = Math.random().toString(36).substr(2, 12);
var randomNumber2 = Math.floor(Math.random() * Math.floor(81458));

var oHeader = {alg: 'HS256', cty: 'text/plain'};
var oPayload = {};
oPayload.publicKey = "myPublicKey";
oPayload.schema = "mySchema";
oPayload.baseUrl = "www.example.org";
oPayload.exp = (new Date().getTime() / 1000|0)  + 5 * 60;
oPayload.iss = "myIssuer";
oPayload.domain = "myDomain";
oPayload.jti = randomNumber1 + "-" + randomText + "-" + (new 
Date().getTime() / 1000|0)  + 5 * 60;
oPayload.iat = new Date().getTime() / 1000|0;

var hash = CryptoJS.MD5("Message", (new Date().getTime() / 1000|0)  
+ 5 * 60);
console.log(hash);

Если требуется дополнительная информация, пожалуйста, спросите.

Заранее спасибо.

1 Ответ

0 голосов
/ 22 августа 2019

Другой ответ, связанный с Mark M. , содержит выдержку из спецификации JWT, которая описывает требования к заявке jti .По сути, он работает как идентификатор, поэтому он должен быть уникальным в любой области его использования.Что это означает, зависит от приложения.

Не важно, чтобы это утверждение было трудно угадать, поскольку каждый раз, когда вы создаете новое, вы подаете в отставку и восстанавливаете весь токен.Таким образом, вы могли бы даже использовать простой счетчик, при условии, что вы можете гарантировать, что один и тот же счетчик никогда не будет использоваться дважды на разных токенах, даже случайно.

В большинстве случаев какое-то уже установленное решение для генерации (полу-)случайные уникальные идентификаторы, вероятно, будут вашим лучшим выбором.Некоторые предложения:

  1. Чтобы быть уверенным, что вы можете использовать UUID.Для них существует популярный пакет npm .
  2. Реализация этого пакета, по-видимому, основана на нативном crypto.randomBytes() Node, который сам по себе является опцией.
  3. Если выиспользуйте Mongo, возможно, будет работать ObjectId Mongo.
  4. Использование Math.random() (и, возможно, даты), как это делал ваш коллега, также может быть вариантом.
  5. Как уже упоминалось, счетчик может работатьв некоторых сценариях.

Каждый из них обеспечивает разную степень случайности / уникальности, при этом загружая ЦП по-разному и получая идентификаторы разных размеров / длин.Вы сами решаете, какое решение является наиболее подходящим.Для моего варианта использования я выберу randomBytes, так как считаю его достаточным для своих нужд:

Насколько случайным является crypto # randomBytes?

шансы криптографически безопасного генератора случайных чисел, генерирующего тот же uuid, достаточно маленький, чтобы вам не нужно было проверять уникальность?

Это может быть дорого с точки зрения производительности, но мне не нужно слишком многобайтов и имеет неблокирующий режим, который использует пул потоков libuv.

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