docs: adds rules and agents specs
This commit is contained in:
79
docs/backlog/auth.md
Normal file
79
docs/backlog/auth.md
Normal 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,
|
||||
управление категориями и правилами) доступны только в рамках действующей сессии.
|
||||
- Так как ролевой модели нет, дополнительные ограничения доступа не требуются:
|
||||
оба пользователя имеют одинаковые права.
|
||||
Reference in New Issue
Block a user