ООП в 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.

Такой подход обеспечивает чистую архитектуру, безопасность и удобство повторного использования кода.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.