# Позиция 6: Авторизация и сессии ## 6.1. Общая модель доступа - Приложение предназначено для использования ограниченным числом пользователей (2 человека). - Регистрации пользователей через интерфейс нет. - Учётные данные (логин и пароль) задаются через переменные окружения (`ENV`), например: - `APP_USER_LOGIN` - `APP_USER_PASSWORD` - Ролевой модели нет: все авторизованные пользователи имеют полный доступ ко всем функциям SPA (просмотр, импорт, редактирование, аналитика, управление правилами). ## 6.2. Авторизация Рекомендуемая схема: сессионная авторизация с backend-сессиями и cookie. ### Эндпоинты 1. `POST /api/auth/login` - Вход: JSON с полями `login` и `password`. - Backend сравнивает полученные значения с `ENV` (`APP_USER_LOGIN`, `APP_USER_PASSWORD`). - При успешной аутентификации создаётся сессия и клиенту выдаётся session cookie (например, `sid`), привязанная к записи в БД или in-memory хранилищу. 2. `POST /api/auth/logout` - Инвалидирует текущую сессию (удаляет/помечает как неактивную) и очищает cookie. 3. `GET /api/auth/me` - Возвращает информацию о том, авторизован ли пользователь (например, `200` + базовый профиль или `401`, если сессия недействительна). Все защищённые эндпоинты (`/api/transactions`, `/api/analytics/*`, импорт выписок, управление правилами и т.д.) работают **только** при наличии действующей сессии. ## 6.3. Сессии и таймаут по бездействию Требования: - Авто-логаут при длительном бездействии (жёсткий таймаут). - Таймаут бездействия: **3 часа**. Реализация: - В backend вводится сущность "сессия" (в БД или в памяти) с полями: - `id` — идентификатор сессии; - `created_at` — время создания сессии; - `last_activity_at` — время последней активности по этой сессии; - `is_active` — флаг активности. - При каждом запросе с действительным `sid` backend: 1. Проверяет, не истёк ли таймаут: - если `now - last_activity_at > 3 часа` — сессия инвалидируется (`is_active = FALSE`), возвращается `401 Unauthorized` и на фронтенде пользователь переводится на экран логина; 2. Если таймаут не истёк — обновляет `last_activity_at` текущим временем. - Таймаут **жёсткий**: - нет "длинных" сессий; - нет опции "запомнить меня" — после 3 часов полного бездействия требуется повторный логин. ## 6.4. Интеграция с SPA - При открытии приложения SPA выполняет запрос `GET /api/auth/me`: - если ответ `200` — пользователь остаётся в приложении; - если `401` — показывается форма логина. - При логине (`POST /api/auth/login`): - при успехе SPA сохраняет состояние "авторизован" и переходит к основному интерфейсу. - При получении `401` от любого защищённого API: - SPA сбрасывает локальное состояние пользователя, - перенаправляет на экран логина. ## 6.5. Связь с другими позициями - Все ранее описанные эндпоинты (`/api/transactions`, `/api/analytics/*`, импорт JSON, управление категориями и правилами) доступны только в рамках действующей сессии. - Так как ролевой модели нет, дополнительные ограничения доступа не требуются: оба пользователя имеют одинаковые права.