docs: adds rules and agents specs

This commit is contained in:
Anton
2026-02-27 19:08:55 +03:00
commit 9551b93a09
12 changed files with 1151 additions and 0 deletions

79
docs/backlog/auth.md Normal file
View File

@@ -0,0 +1,79 @@
# Позиция 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,
управление категориями и правилами) доступны только в рамках действующей сессии.
- Так как ролевой модели нет, дополнительные ограничения доступа не требуются:
оба пользователя имеют одинаковые права.