Some checks failed
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
2.8 KiB
2.8 KiB
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 потребуется:
- Изменить
providerв schema.prisma наpostgresql - Обновить
DATABASE_URL - Выполнить
prisma migrate dev - Никаких изменений кода не требуется (Prisma abstracts database)