Как запретить параллельное (одновременное) использование одного аккаунта разными пользователями?

Use case: есть платная платформа, в которой нужно запретить использование одного аккаунта большим (> 1) количеством пользователей одновременно. Если есть активность одного пользователя - то запрещать вход другим пользователям в этот аккаунт.

Каким образом реализуется данный функционал? Как запретить параллельное (одновременное) использование одного аккаунта разными пользователями? Как понять, что пользователь не активен и давать возможность залогиниться с другого устройства? Может быть ограничивать вход по IP?

Поделитесь практикой, коллеги.
  • Вопрос задан
  • 7251 просмотр
Решения вопроса 1
Zatmil
@Zatmil
Fullstack-разработчик
Как это реализован в одном моем сервисе. При авторизации создается токен, который дальше отправляется со всеми запросами от пользователя. Как только с данного аккаунта делается еще одна авторизация, то создается новый токен, а все предыдущие обнуляются и запросы с этим токенами начинают возвращать 403 ошибку.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
@hckn
Просто делай логаут, если зафиксирован логин с другого устройства.
Ответ написан
sergiks
@sergiks Куратор тега PHP
♬♬
Залогиненный пользователь должен «запирать» под себя аккаунт, не допуская дополнительные входы под этим же аккаунтом.

Как отличать «этот» визит от «других». Точно не по IP, т.к. пользователь может быть мобильным. По «отпечатку браузера» или по набору cookies.
При очередном запросе мутировать куку, чтобы копирование кук на другое устройство не помогло. Что-то вроде CSRF-токенов использовать при каждом запросе.
На случай вылета пользователя предусмотреть timeout, по истечении которого разрешать любой логин в этот аккаунт.
Ответ написан
sim3x
@sim3x
Вам нужны forevercookies и/или идентификация по доп параметрам, например https://github.com/Valve/fingerprintjs2

Но лучше такие вещи решать административным способом - так чтоб использовать один акк на несколько человек не требовалось
Ответ написан
Expany
@Expany
$this->get('skill');
по IP, по статусу создания куки, по сессии, по дополнительному идентификатору, который ты можешь отследить, в рамках текущего сеанса пользователя. Вариантгв масса.

Я бы использовал дополнительное поле в базе, куда записывал бы 1, после авторизации.
А на этапе авторизации, проверял бы это поле, если там 1, облом, иначе авторизуем.

Но это лишь пример.
Ответ написан
web-verzus-team
@web-verzus-team
Full Stack Developer
При логине сохраните session_id() в базе данных. Затем сравниваете текущий с тем, что записано в базе, и если не совпадает - логаут.
$db_session_hash= $db_session_hash ?: get_session_hash($__id);//Хеш "текущей" активной сессии в базе если не получен ранее
			if($db_session_hash!=$_SESSION['auth']['session_hash']){
				unset($_SESSION['auth']);
				add_notification('danger', 'В ваш аккаунт выполнен вход на другом устройстве или браузере.');
			}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы