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