Как реализовать безопасную авторизацию и аутентификацию на PHP?

Доброго времени суток!

Подскажите, пожалуйста, как в настоящий момент реализуется авторизация и аутентификация пользователей в приложении на PHP?

В приложении будет 2 типа пользователей:
1. Администратор
2. Пользователь

С администратором, все более менее понятно. Для администраторов будет отдельная таблица в БД, с логином и паролем (через password_hash). Также,будет отдельная форма авторизации. Ввел логин и пароль, записали в $_SESSION. Закрыл браузер - сессии удалились. При повторном входе - новая авторизация.

А вот как быть с пользователями? Задача стоит оставлять пользователей авторизованными как минимум на 6 месяцев. Другой реализации, кроме как через $_COOKIES, я не вижу (могу и ошибаться).

Сейчас реализовано так (не мной, я так понял заказчик сам это сделал, хотя сослался на другого фрилансера): при авторизации через форму, проверяется корректность пароля в БД (через password_verify) и в куки записывается его логин. При входе на закрытые страницы, проверяется наличие логина в куках, если он есть - делается запрос в БД на проверку наличия этого логина и выводится вся информация о пользователе по этому логину.

Как я сейчас вижу решение:
1. Создать в таблице пользователей столбец salt (уникальная строка, которая будет генерироваться при регистрации).
2. В куки записывать хэш, который генерируется через password_hash из столбца salt, а также id пользователя.
3. При входе на закрытые страницы, делать запрос в БД на получение поля salt по id из куки.
4. Сгенерировать новый хэш через password_hash и полученным полем salt из БД и проверить его с хэшем в куках.

Если сделать так, то такая проверка на каждой закрытой странице - нагнет сервер.
Думаю сделать еще так: если хэши совпали на пункте 4, создать сессию авторизации ($_SESSION['auth']) и делать проверки на ее наличие на всех закрытых страницах. Если пользователь закроет браузер - сессия удалится, а кука останется. При повторном входе будет только один запрос в БД, который проверит куку и salt и создаст новую сессию.

Вот написал этот текст, перечитал, вроде все ок, но что-то смущает. Пожалуйста, подскажите, как это правильно реализуется сейчас? C php-фреймворками не работал, посмотрел классы авторизации на github, но они все реализованы на сессиях (например), а мне нужно долго хранить пользователя без разлогинивания. Или я что-то не правильно понимаю?

Заранее спасибо за помощь!
  • Вопрос задан
  • 252 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Можно много вариантов придумать.
Statefull - храним сессии в БД (session_set_save_handler), через session_set_cookie_params устанавливаем нужный срок жизни сессионной куки.
Stateless - используем JWT, refresh-токену задаём нужный срок жизни.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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