Как обновлять токены авторизации для нескольких устройств?

Здравствуйте, подскажите по логике авторизации по 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ух устройств сразу и все в норме

В итоге мы имеем доступы у всех и с точки зрения приложения все прекрасно, я понимаю что можно в ЛК клиента сделать вкладку "Ваши сессии" и выводить все кроме текущей, чтобы он мог сам из удалить и закрыть доступ у злоумышленника, он если он украл один раз все его токены, то украдет и второй раз

Что-то я н понимаю, подскажите пожалуйста где ошибка?
  • Вопрос задан
  • 174 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
При использовании refresh-токен помечается в базе как использованный. При попытке повторно использовать тот же токен удаляются все refresh-токены пользователя и запрашивается логин/пароль.
Refresh-токен удаляется из базы после истечения срока его жизни.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Vamp
@Vamp
На этапе 3 нужно просто не принимать запрос, если fingerprint злоумышленника отличается от fingerprint пользователя. Другими словами - привязать refresh_token к устройству клиента.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
02 авг. 2021, в 23:34
750 руб./в час
02 авг. 2021, в 23:03
10000 руб./за проект
02 авг. 2021, в 23:03
45000 руб./за проект