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