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 использует текущее время в качестве входных данных. Но возникает другой вопрос: как сервер проверяет токен? Если текущее время находится в токене, сервер никогда не проверит токен как действительный из-за другого времени.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Он не использует 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);
У вас есть некоторые сомнения относительно того, как работает JWT в целом, поэтому я предлагаю краткое введение в то, как они работают. Ваш JWT внутри содержит несколько фрагментов информации, известных как претензии. Обычно они включают что-то вроде следующего:
Чтобы сосредоточиться на вашем конкретном вопросе, expiryTime (стандартное имя exp) хранит метку времени, когда истечет срок действия JWT. Первое, что сервер сделает для проверки входящего JWT, откроет его и проверит, что время истечения срока действия не истекло. Если он имеет прошел, то сервер сразу отклонит токен. Таким образом, время истечения срока действия используется в качестве привратника для защиты вашего приложения от устаревших токенов.
Помимо этого, обычно был бы еще один шаг проверки, когда сервер должен был бы обратиться к чему-то вроде кеша или, возможно, базы данных, чтобы убедиться, что JWT действительно все еще действителен. Для этой проверки в качестве ключа для поиска будет использоваться username или какой-либо другой уникальный идентификатор, соответствующий пользователю.
Я также включил утверждение, которое я назвал level. Предполагая, что ваше приложение может иметь разные уровни аутентификации, уровень может хранить состояние, соответствующее этому.
Спасибо, но я читал, что сервер проверяет токен на лету, а не сравнивает с сохраненным токеном.
Токен Сохранено? Где я упоминал что-либо о хранении токена?
Помимо этого, обычно был бы еще один шаг проверки, когда сервер должен был бы нажать что-то вроде cache or maybe a database, чтобы убедиться, что JWT действительно все еще действителен. Для этой проверки имя пользователя или какой-либо другой уникальный идентификатор, соответствующий пользователю, будет использоваться в качестве ключа для поиска.
Да, но я никогда не говорил хранить токен. Будет сделана только очень маленькая запись в кэше или базе данных. И да, вам нужно сделать это, в общем, потому что JWT не полностью не имеет состояния. Нет, если вам никогда не нужно ограничивать токен, что, вероятно, не в вашем случае.
Да, поэтому сервер не может проверить токен на лету.
ОК... сервер могу оценивает токен на лету, но есть одна оговорка. Допустим, один из ваших пользователей вышел из системы. Теперь у вас есть проблема. Это проблема, потому что существует действительный JWT, который ваш пользователь указал, что он хотел аннулировать. Таким образом, один из способов справиться с этим — добавить JWT этого пользователя в черный список (кэш, база данных и т. д.). Затем, если кто-то другой попытается использовать этот JWT, ваш сервер может проверить кеш и отклонить. Но... это теперь означает, что вы должны поддерживать какое-то маленькое государство.
Теоретически JWT можно сделать почти полностью безгражданским, но для этого потребуется немного инженерной и дизайнерской работы. Это хороший фреймворк, если у вас есть интерес попробовать его использовать.
@HenokTesfaye Если я упустил какие-либо важные моменты, которые вам нужно было осветить, оставьте комментарий, и, возможно, я смогу что-то добавить к своему ответу.
Спасибо @PrithweeDas. Вы не упомянули, как сервер проверяет токен.