moex-vibe/apps/docs/docs/adr/ADR-008-auth-system.md
Sergey Krylov 106467e5c4
All checks were successful
CI / lint (pull_request) Successful in 2m8s
CI / test (pull_request) Successful in 1m57s
CI / build (pull_request) Successful in 2m5s
CI / lint (push) Successful in 2m1s
CI / test (push) Successful in 1m51s
CI / build (push) Successful in 2m9s
docs: translate docs to russian
2026-06-16 05:13:34 +03:00

2.9 KiB
Raw Blame History

sidebar_position, title
sidebar_position title
14 ADR-008

ADR-008: Система Authentication и Authorization

Статус

Accepted

Контекст

Приложение MoexVibe публичное, но для персонализации и будущих функций (избранное, уведомления, подписки) требуется система аутентификации. Необходимо решение, которое:

  • Безопасно хранит учётные данные
  • Поддерживает session management
  • Позволяет расширять ролевую модель
  • Интегрируется в существующий стек (NestJS + React)

Решение

Backend

  • База данных: SQLite через Prisma ORM без внешнего сервиса
  • Auth strategy: JWT access tokens (15m) + refresh tokens (7d) в httpOnly cookies
  • Хранение паролей: bcrypt with 12 salt rounds
  • Guard model: глобальный JwtAuthGuard (все маршруты защищены по умолчанию, @Public() для открытых)
  • RBAC: Роли user и admin, проверка через RolesGuard

Frontend

  • Управление состоянием: React Context (AuthContext) для хранения пользователя и access token
  • Token storage: access token только в памяти (не localStorage), refresh token в httpOnly cookie
  • Auto-refresh: При 401 → автоматический вызов /auth/refresh → повтор оригинального запроса
  • Route protection: компонент ProtectedRoute, редирект на /login с return URL

Последствия

Плюсы

  • httpOnly cookie защищает refresh token от XSS
  • Access token в памяти защищён от кражи через localStorage
  • Prisma + SQLite не требует внешнего сервиса (zero setup)
  • Refresh token rotation повышает безопасность
  • Глобальный guard — безопасность по умолчанию

Минусы

  • Access token теряется при полной перезагрузке страницы (восстанавливается через refresh cookie)
  • Для production требуется генерация надёжных JWT_SECRET
  • Rate limiting на login endpoint не входит в текущее решение
  • Нет верификации email (принятое упрощение)

Путь миграции

Для перехода на PostgreSQL потребуется:

  1. Изменить provider в schema.prisma на postgresql
  2. Обновить DATABASE_URL
  3. Выполнить prisma migrate dev
  4. Никаких изменений кода не требуется: Prisma абстрагирует database