Здравствуйте, подскажите по логике авторизации по access\refresh токенам для нескольких устройств одного пользователя? не могу понять как инвалидировать украденные токены и не навредить реальному клиенту?
у меня есть ход мыслей и он такой
нагуглил такой ответ, но не понял его
Какая верная стратегия обновления refresh_token'а для нескольких устройств?
- access_token (user_id + fingerptint) - в базе его не храним, в нагрузке идентификатор клиента и его устрйокста
- refresh_token - храним вместе с user_id, fingerprint, exp_at
1) В базе у нас есть таблица
user_id, fingerprint, refresh_token, exp_at
те строка соответствия id юзера, какого-то ключа устройства (фингерпринт) и сам рефреш-токен с датой валидности
2) злоумышленник украл наши токеныи шлет запрос на обновление токена (шлет ведь сразу оба токена?)
из access_token мы получаем (user_id + fingerprint), хоть он и просрочен
смотрим рефреш токен в базе
те ищем строку user_id + fingerprint + refresh_token
есть такая строка (логин нашего настоящего клиента ее туда поместил)
3) для злоумышленника генерируем новый аксес-токен и новый рефреш-токен обновляем в бд запись
user_id + fingerprint + refresh_token
злоумышленник всем этим прекрасно пользуется неограниченное время
4) наш пользователь аналогично пользуется своим аксес-токен, но он у него заканчивается и он шлет запрос обновления
5) мы в базе ищем его рефреш токен
user_id + fingerprint + refresh_token
и не находим, так как его обновил наш злоумышленник со соим фингерпринт, используя ранее украденные токены
6) соответсвенно клиента кидаем на авторизацию, он логинится и получает свои 2 токена, а злоумышленник продолжает пользоваться токенами. Приложение думает что просто клиент наш авторизован с 2ух устройств сразу и все в норме
В итоге мы имеем доступы у всех и с точки зрения приложения все прекрасно, я понимаю что можно в ЛК клиента сделать вкладку "Ваши сессии" и выводить все кроме текущей, чтобы он мог сам из удалить и закрыть доступ у злоумышленника, он если он украл один раз все его токены, то украдет и второй раз
Что-то я н понимаю, подскажите пожалуйста где ошибка?