Files
family_budget/docs/backlog/auth.md
2026-02-27 19:08:55 +03:00

80 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Позиция 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,
управление категориями и правилами) доступны только в рамках действующей сессии.
- Так как ролевой модели нет, дополнительные ограничения доступа не требуются:
оба пользователя имеют одинаковые права.