Безопасность и данные
Аутентификация, авторизация, секреты и правила хранения.
Аутентификация и авторизация
Better Auth управляет password credentials, reset tokens и сессиями. Публичная
регистрация отключена. Бизнес-доступ определяется отдельными таблицами Role,
Permission, UserRole и RolePermission.
UI не является границей доступа
Скрытый пункт меню или disabled-кнопка только улучшают интерфейс. Каждая Server Action и защищённая страница самостоятельно проверяет permission.
Шифрование credentials
Apple .p8, Google service-account JSON и bearer token n8n шифруются
AES-256-GCM с уникальным IV. Master key приходит только из
FEEDBACK_CREDENTIALS_ENCRYPTION_KEY и не сохраняется в PostgreSQL.
Нельзя передавать расшифрованные секреты в Client Components, browser props, логи или Audit Log. Settings показывает только безопасные поля и факт наличия credential.
Основные группы данных
| Область | Модели | Свойства |
|---|---|---|
| App Feedback | FeedbackIntegration, AppReview, FeedbackReply, FeedbackSyncRun | Идемпотентный upsert, история попыток ответа |
| QR Feedback | FeedbackEntity, ManagedQrCode, QrFeedback, QrFeedbackSetting | Immutable submissions, snapshot entity, soft delete |
| Доступ | User, Role, Permission, UserRole, RolePermission | Много ролей на пользователя |
| Аудит | AuditEvent | Действие, actor, target и безопасные details |
DATABASE_SCHEMA изолирует приложение внутри общей PostgreSQL database.
Runtime использует DATABASE_URL; для DDL рекомендуется отдельный
MIGRATION_DATABASE_URL.
Публичная QR-форма
- принимает JSON не более 16 KiB;
- rating — целое число 1–10;
- comment необязателен, до 2000 символов;
- source identity определяется по
X-Real-IP, затемX-Forwarded-For; - concurrency контролируется PostgreSQL advisory locks;
- удаление из inbox — soft delete с audit-событием.
Логи и аудит
Безопасно логировать operation name, request ID, status/code и агрегированные счётчики. Нельзя логировать provider tokens, полный credential payload, QR-комментарии, полные списки email-получателей или непроверенное содержимое исключений.
Миграции
Каждое изменение prisma/schema.prisma поставляется вместе с проверенной
migration. В production применяется только:
pnpm db:deployНе используйте prisma db push или prisma migrate dev против production.

