'/', 'httponly' => true, 'samesite' => 'Lax', 'secure' => $https, ]); session_start(); } /** * Текущий пользователь по сессии или null. * * @return array{id: int, email: string}|null */ function current_user(PDO $pdo): ?array { session_start_secure(); $id = $_SESSION['user_id'] ?? null; if (!is_int($id)) { return null; } $stmt = $pdo->prepare('SELECT id, email FROM users WHERE id = ?'); $stmt->execute([$id]); $user = $stmt->fetch(); if (!is_array($user)) { return null; } return ['id' => (int)$user['id'], 'email' => (string)$user['email']]; } /** * Текущий пользователь или 401. * * @return array{id: int, email: string} */ function require_user(PDO $pdo): array { $user = current_user($pdo); if ($user === null) { error_out(401, 'unauthorized'); } return $user; } /** Установить сессию после успешного login (id перегенерируется). */ function login_user(int $id): void { session_start_secure(); session_regenerate_id(true); $_SESSION['user_id'] = $id; } /** Полный выход: очистка $_SESSION, cookie и уничтожение сессии. */ function logout_user(): void { session_start_secure(); $_SESSION = []; if (ini_get('session.use_cookies')) { $params = session_get_cookie_params(); setcookie(session_name(), '', [ 'expires' => time() - 42000, 'path' => $params['path'], 'domain' => $params['domain'], 'secure' => $params['secure'], 'httponly' => $params['httponly'], 'samesite' => $params['samesite'] ?? 'Lax', ]); } session_destroy(); }