moex-vibe/apps/docs/docs/adr/ADR-008-auth-system.md
Sergey Krylov c2478277e6
Some checks failed
CI / lint (pull_request) Failing after 1m45s
CI / test (pull_request) Failing after 1m42s
CI / build (pull_request) Failing after 1m31s
CI / lint (push) Failing after 1m46s
CI / test (push) Failing after 1m34s
CI / build (push) Failing after 1m35s
feat: add authentication system with JWT + RBAC
Backend:
- AuthModule with register, login, logout, refresh, profile endpoints
- JwtAuthGuard (global, opt-out via @Public) + RolesGuard (@Roles)
- PrismaModule with SQLite via @prisma/adapter-libsql (Prisma 7)
- Auth configuration in configuration.ts

Frontend:
- Auth context with session restoration via refresh cookie
- Login, Register, Profile pages with ProtectedRoute
- Auto-refresh on 401 with token rotation
- API client refactored for auth headers

Russian text: auth flows translated to Russian
All text translated: auth pages, profile, layout, loading states
2026-06-13 22:24:46 +03:00

2.8 KiB
Raw Blame History

sidebar_position, title
sidebar_position title
14 ADR-008

ADR-008: Authentication & Authorization System

Status

Accepted

Context

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

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

Decision

Backend

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

Frontend

  • State management: 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

Consequences

Positive

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

Negative

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

Migration Path

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

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