Использует ли jwt текущее время в качестве входных данных, чтобы каждый раз получать разные токены? - PullRequest
0 голосов
/ 12 марта 2019
  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: 'henok@gmail.com',
    username: 'henoktes72'
}

createToken(user, secret, '30m')

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

Ответы [ 2 ]

1 голос
/ 12 марта 2019

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

  • имя пользователя
  • expiryTime
  • level

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

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

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

0 голосов
/ 12 марта 2019

Не используется 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...