@Barrakuda74

Как выглядит логика простой системы авторизации с «выходом на всех устройствах»?

При этом используя только PHP, MySQL, сессии и куки (без redis'ов, мемкешов и т.д.).
Просто когда начал писать восстановление пароля (по сути сброс, новый приходит на почту юзеру), понял что по логике здесь должен быть "выход на всех устройствах", а как организовать, не пойму.

Админки до этого как-то особо не нужны были, поэтому использовал их только для своих самых маленьких нужд с простой записью auth=true в сессии. По выключении браузера сессия терялась. Знаю что можно увеличить жизнь сессии, но вроде как не рекомендуют, пишут лучше потом восстанавливать их по кукам(дополнительные видимо ещё ставить, не сессионные) или токенам в БД (не сталкивался). Вот хотел спросить чего куда записывать-то в итоге, чтобы можно было потом различать авторизации пользователя с разных устройств, и чтобы разом их можно было снести при сбросе пароля?

Пока образно могу себе как-то так представить:
1. Авторизуемся -> заполняем сессию, записываем дополнительную (долгосрочную, напр 3 дня) куку с рандом-строкой (mycoockie = "dsf34Nrty4d4dftlk5r4g5") для восстановления сессии, записываем в БД в таблице sessions эту же самую строку ("dsf34Nrty4d4dftlk5r4g5") и ID пользователя, кому принадлежит сессия.

открываем след. страницу:

2. Если есть сессия -> работаем (или тоже постоянно сверять чтобы были какие-то актуальные данные в БД, ведь возможно я злоумышленник, а реальный пользователь воспользовался сбросом пароля, т.е. меня должно сразу выкинуть).

3. Если пропала (закрывали браузер или 24 минуты неактивности что вроде по умолчанию для сессий), проверяем куку (mycoockie), и если в ней какая-нибудь рандом-строка. -> проверяем наличие этой рандомной строки в БД, если найдена, то восстанавливаем по ID напротив этой строки данные юзера.
  • Вопрос задан
  • 751 просмотр
Решения вопроса 1
AHTUxPK
@AHTUxPK
У меня реализовано следующим образом:

Есть в БД таблица sessions с полями current_session, long_session, user_id и login_time.
При успешном логине генерируются две случайные строки. Первая записывается в стандартную PHP сессию и будет current_session. Вторая записывается пользователю в куку session, а хеш этой строки будет long_session. user_id - идентификатор пользователя, login_time - время логина.

Проверка, залогинен ли пользователь, выполняется следующим образом:
1. Если у пользователя есть активная PHP сессия, проверяем, активна ли его current_session, если да, то пользователь авторизован.
2. Если у пользователя нет текущей сессии, но установлена кука session, то ищем хеш от неё в базе. Если запись есть и с момента последнего логина прошло меньше указанного количество времени (я использую меньше трёх месяцев), то по user_id берём остальные данные пользователя и создаём текущую сессию, пользователь авторизован.

При logout просто очищаем текущие current_session и long_session. Если нужно разлогинить везде, то очищаем все эти значение по user_id.

Такой подход позволяет строго управлять сессиями с помощью БД, но при этом стандартный механизм PHP сессий позволяет хранить разнообразную информацию, типо csrf токенов, не захламляя базу.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Смена токена учётки на сервере и привед при следующем запросе.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы