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