Является ли хорошей идеей иметь случайно сгенерированный токен внутри полезной нагрузки JWT и проверять базу данных при каждом запросе?
Я провел свой поиск по JWT и как он на самом деле работает, и яЯ знаю, что его главная цель - избегать запросов к базе данных при каждом запросе для авторизации пользователя, но мне все равно нужно это делать, поскольку мне нужна определенная информация о пользователе, который делает запрос.
Мне также нужен хорошийРешение немедленно отозвать токен, если мне нужно.Чёрный список токена изначально кажется хорошим решением, но для этого потребуются дополнительные запросы, и я не думаю, что оно того стоит.
Итак, решение, которое я нашел, состоит в том, чтобы сгенерировать случайный токен и сохранить этот токен в моей базе данных, а также поместить его в полезную нагрузку JWT.Таким образом, когда пользователь делает новый запрос, он сначала проверяет, является ли токен JWT действительным, и если это так, то он проверяет, является ли токен, связанный с полезной нагрузкой, действительным.
Так что, если пользователю нужно изменитьнапример, его пароль, его токен изменится, и все токены JWT с предыдущим токеном в их полезной нагрузке не будут проверены.
Таким образом, решение будет таким:
Когда пользователь регистрируется,он назначается с randomToken и также сохраняется внутри полезной нагрузки.Если регистрация прошла успешно, сервер возвращает сгенерированный jwtToken.
var jwtToken = jwt.sign({token: randomToken}, PRIVATE_KEY, SIGN_OPTIONS);
Поэтому, когда пользователь делает новый запрос, он сначала проверяет, является ли токен JWT действительным.
var legit = jwt.verify(token, JWT_PUBLIC_KEY, SIGN_OPTIONS);
Еслиэто значит, что он выполняет проверку токена внутри полезной нагрузки с помощью токена пользователя в базе данных.
SELECT * FROM users WHERE token = legit.token
Если все верно, он затем выполняет обычный запрос.