Как сделать недействительным токен JWT, сгенерированный ранее, при сбросе / изменении пароля в java

Я создал AccessToken (токен JWT), Я хочу аннулировать этот токен во время сброса пароля / смены пароля (то есть: старый токен доступа должен быть недействительным, а новый - действительным)

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
837
4

Ответы 4

Я думаю, вам нужно хранить токен jwt в базе данных (лучше в базе данных в памяти). Когда пользователь меняет пароль, удалите токен конкретного пользователя. Каждый раз, когда вы проверяете токен, вы проверяете наличие токена в базе данных.

Недействительные веб-токены JSON

Он спрашивает о токенах jwt. Нет смысла использовать токены jwt, если вы храните их в db.

Alexander Danilov 11.11.2018 10:18

Прежде всего, аннулируйте / удалите JWT на стороне клиента, когда пароль успешно сброшен.

Захватите метку времени смены пароля в таблице.

Предоставьте метку времени «проблема в (iat)» в полезной нагрузке токена JWT.

Когда токен декодируется на сервере, проверьте, является ли временная метка «iat» более ранней, чем временная метка смены пароля. если да, то аннулируйте токен.

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

Какой смысл в jwt, если вам нужно получить доступ к db, чтобы проверить это? Лучше использовать обычные токены, хранящиеся в db. Не так ли?

Alexander Danilov 11.11.2018 10:21

Один из подходов к этому - сохранить в базе данных такое поле, как token_seq. Затем вы включаете user_id и token_seq в свой JWT. Во время процесса сброса пароля вы увеличиваете поле token_seq. При проверке вашего JWT вы проверяете как user_id, так и token_seq.

Это дает вам возможность аннулировать все «старые» токены в любое время.

ОБНОВЛЕНИЕ: Другой подход от этот ответ - использовать хэш любого значения пароля, которое вы уже сохраняете для пользователя. Это означает, что при изменении пароля все старые токены автоматически аннулируются.

Я слишком поздно для ответа, но я думаю, что это может помочь кому-то другому. если вы хотите аннулировать свой jwt после изменения пароля, это легко сделать, но вам нужно только понять, что когда вы меняете секретный ключ, токен jwt больше недействителен, что вам нужно сделать, это поставить хешированный пароль в качестве secet ключ для вашего jwt и убедитесь, что новый пароль не очень старый, и он не может знать, что это он

Бонус

убедитесь, что срок действия истекает на небольшое количество времени, например 1 час, чтобы сделать его более безопасным

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