Files
2026-02-27 19:08:55 +03:00

4.9 KiB
Raw Permalink Blame History

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