Использует ли jwt текущее время в качестве входных данных, чтобы каждый раз выдавать разные токены?

  const createToken = async (user, secret, expiresIn) => {
    const { id, email, username } = user;
    return await jwt.sign({ id, email, username }, secret, {
      expiresIn
    });
  };

jwt для одного и того же ввода приводит к другому токену.

const user = {
    id: '1',
    email: '[email protected]',
    username: 'henoktes72'
}

createToken(user, secret, '30m')

Поэтому я предполагаю, что jwt использует текущее время в качестве входных данных. Но возникает другой вопрос: как сервер проверяет токен? Если текущее время находится в токене, сервер никогда не проверит токен как действительный из-за другого времени.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
276
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Он не использует current time + expiresIn в качестве времени истечения срока действия. если вы декодируете токен jwt, вы увидите два поля iat и exp, где iat — время создания токена.

jwt.sign({ id, email, username }, secret, {
      expiresIn: '30m'
});

этот код эквивалентен

jwt.sign({ id, email, username, exp: Date.now()+30*60*1000 }, secret);

Спасибо @PrithweeDas. Вы не упомянули, как сервер проверяет токен.

Henok Tesfaye 12.03.2019 14:33
Ответ принят как подходящий

У вас есть некоторые сомнения относительно того, как работает JWT в целом, поэтому я предлагаю краткое введение в то, как они работают. Ваш JWT внутри содержит несколько фрагментов информации, известных как претензии. Обычно они включают что-то вроде следующего:

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

Чтобы сосредоточиться на вашем конкретном вопросе, expiryTime (стандартное имя exp) хранит метку времени, когда истечет срок действия JWT. Первое, что сервер сделает для проверки входящего JWT, откроет его и проверит, что время истечения срока действия не истекло. Если он имеет прошел, то сервер сразу отклонит токен. Таким образом, время истечения срока действия используется в качестве привратника для защиты вашего приложения от устаревших токенов.

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

Я также включил утверждение, которое я назвал level. Предполагая, что ваше приложение может иметь разные уровни аутентификации, уровень может хранить состояние, соответствующее этому.

Спасибо, но я читал, что сервер проверяет токен на лету, а не сравнивает с сохраненным токеном.

Henok Tesfaye 12.03.2019 14:27

Токен Сохранено? Где я упоминал что-либо о хранении токена?

Tim Biegeleisen 12.03.2019 14:28

Помимо этого, обычно был бы еще один шаг проверки, когда сервер должен был бы нажать что-то вроде cache or maybe a database, чтобы убедиться, что JWT действительно все еще действителен. Для этой проверки имя пользователя или какой-либо другой уникальный идентификатор, соответствующий пользователю, будет использоваться в качестве ключа для поиска.

Henok Tesfaye 12.03.2019 14:28

Да, но я никогда не говорил хранить токен. Будет сделана только очень маленькая запись в кэше или базе данных. И да, вам нужно сделать это, в общем, потому что JWT не полностью не имеет состояния. Нет, если вам никогда не нужно ограничивать токен, что, вероятно, не в вашем случае.

Tim Biegeleisen 12.03.2019 14:29

Да, поэтому сервер не может проверить токен на лету.

Henok Tesfaye 12.03.2019 14:31

ОК... сервер могу оценивает токен на лету, но есть одна оговорка. Допустим, один из ваших пользователей вышел из системы. Теперь у вас есть проблема. Это проблема, потому что существует действительный JWT, который ваш пользователь указал, что он хотел аннулировать. Таким образом, один из способов справиться с этим — добавить JWT этого пользователя в черный список (кэш, база данных и т. д.). Затем, если кто-то другой попытается использовать этот JWT, ваш сервер может проверить кеш и отклонить. Но... это теперь означает, что вы должны поддерживать какое-то маленькое государство.

Tim Biegeleisen 12.03.2019 14:33

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

Tim Biegeleisen 12.03.2019 14:36

@HenokTesfaye Если я упустил какие-либо важные моменты, которые вам нужно было осветить, оставьте комментарий, и, возможно, я смогу что-то добавить к своему ответу.

Tim Biegeleisen 12.03.2019 14:36

Другие вопросы по теме