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