ООП в PHP: Как реализовать приватный статический метод tryAuthUserByCookie() для автоматического входа пользователя через куки?
Автоматический вход пользователя через куки (remember me) — распространённая задача в веб-разработке. В рамках ООП в PHP такой функционал удобно инкапсулировать в приватный статический метод класса аутентификации.
## Принцип работы
Когда пользователь выбирает «Запомнить меня», в куки сохраняется уникальный токен. При следующем визите сервер читает этот токен, сверяет с базой данных и, если совпадение найдено, авторизует пользователя автоматически.
## Пример реализации
php
class Auth
{
private static string $cookieName = ‘remember_token’;
private static int $cookieLifetime = 30 * 24 * 3600; // 30 дней
public static function check(): bool
{
if (isset($_SESSION[‘user_id’])) {
return true;
}
return self::tryAuthUserByCookie();
}
private static function tryAuthUserByCookie(): bool
{
$token = $_COOKIE[self::$cookieName] ?? null;
if (empty($token)) {
return false;
}
// Ищем токен в базе данных
$userToken = UserToken::findByToken($token);
if (!$userToken || $userToken->isExpired()) {
self::clearCookie();
return false;
}
$user = User::findById($userToken->user_id);
if (!$user) {
self::clearCookie();
return false;
}
// Авторизуем пользователя через сессию
$_SESSION[‘user_id’] = $user->id;
// Обновляем токен (ротация для безопасности)
self::refreshToken($userToken, $user->id);
return true;
}
private static function refreshToken(UserToken $oldToken, int $userId): void
{
$oldToken->delete();
$newToken = bin2hex(random_bytes(32));
UserToken::create([
‘user_id’ => $userId,
‘token’ => hash(‘sha256’, $newToken),
‘expires_at’ => date(‘Y-m-d H:i:s’, time() + self::$cookieLifetime),
]);
setcookie(
self::$cookieName,
$newToken,
time() + self::$cookieLifetime,
‘/’,
»,
true, // secure
true // httpOnly
);
}
private static function clearCookie(): void
{
setcookie(self::$cookieName, », time() — 3600, ‘/’);
unset($_COOKIE[self::$cookieName]);
}
}
## Ключевые аспекты безопасности
1. **Хранение хэша токена** — в куки передаётся оригинальный токен, а в БД хранится его SHA-256 хэш, чтобы утечка базы не позволила злоумышленнику войти.
2. **Ротация токена** — при каждом использовании токен обновляется, что предотвращает повторное использование перехваченного значения.
3. **Флаги httpOnly и secure** — куки недоступны через JavaScript и передаются только по HTTPS.
4. **Срок действия** — токен имеет ограниченное время жизни как в куки, так и в базе данных.
5. **Метод приватный** — внешний код не может вызвать tryAuthUserByCookie() напрямую, только через публичный метод check().
## Почему метод статический?
Статический метод оправдан, когда объект класса не нужен — аутентификация работает с глобальным состоянием (сессия, куки, БД) и не зависит от конкретного экземпляра класса Auth.
Такой подход обеспечивает чистую архитектуру, безопасность и удобство повторного использования кода.
