Диаграммы потоков данных¶
1. Поток аутентификации¶
1.1 Регистрация/вход пользователя через Supabase¶
sequenceDiagram
participant U as 👤 Пользователь
participant F as 🖥️ Frontend
participant S as 🔐 Supabase Auth
participant B as ⚙️ Backend
participant DB as 🗄️ PostgreSQL
U->>F: 1. Google OAuth / Email вход
F->>S: 2. Аутентификация
S-->>F: 3. Supabase JWT токен
F->>B: 4. POST /api/auth/supabase/login
Note right of F: {supabase_token}
B->>S: 5. Верификация JWKS
S-->>B: 6. Токен валиден
B->>DB: 7. Upsert пользователя
DB-->>B: 8. User record
B-->>F: 9. Backend JWT (HS256)
F->>F: 10. Сохранение в localStorage
Контроли безопасности:
- [AUTH-004] Верификация Supabase JWKS
- [DATA-001] TLS шифрование в транзите
- [AUTH-002] Backend JWT с 24ч expiration
1.2 Аутентификация API запроса¶
sequenceDiagram
participant U as 👤 Браузер
participant M as 🛡️ Middleware
participant H as 📋 Handler
participant S as ⚙️ Service
U->>M: GET /api/user/balance
Note right of U: Authorization: Bearer <JWT>
rect rgb(255, 240, 240)
Note over M: Валидация токена
M->>M: 1. Извлечение токена
M->>M: 2. Проверка HS256 подписи
M->>M: 3. Проверка exp/iss
M->>M: 4. Извлечение user_id
end
M->>H: Context с user_id
H->>S: Получить баланс для user_id
S-->>H: Данные баланса
H-->>U: 200 OK + balance
Контроли безопасности:
- [AUTH-001] Валидация JWT подписи
- [AUTHZ-004] Скоупинг пользователя через JWT claims
- [HDR-007] CORS валидация origin
2. Финансовые операции¶
2.1 Поток депозита (через Crypto2B)¶
sequenceDiagram
participant U as 👤 Пользователь
participant B as ⚙️ Backend
participant C as 💰 Crypto2B
participant BC as ⛓️ Blockchain
participant DB as 🗄️ БД
U->>B: 1. Запрос депозитного адреса
B->>C: 2. Генерация адреса
C-->>B: 3. Депозитный адрес
B-->>U: 4. Отображение адреса
U->>BC: 5. Отправка криптовалюты
BC->>C: 6. Обнаружение депозита
C->>B: 7. Webhook: депозит подтверждён
Note right of C: Подпись HMAC
rect rgb(240, 255, 240)
Note over B: Обработка webhook
B->>B: 8. Верификация подписи
B->>DB: 9. INSERT транзакции депозита
end
B-->>U: 10. Баланс обновлён
Контроли безопасности:
- [HOOK-001] Верификация подписи webhook
- [HOOK-003] Идемпотентная обработка
- [FIN-006] Immutable лог транзакций
- [DATA-003] Параметризованные SQL запросы
2.2 Поток вывода средств (через Fordefi)¶
sequenceDiagram
participant U as 👤 Пользователь
participant B as ⚙️ Backend
participant A as 👑 Админ
participant F as 🏦 Fordefi
participant BC as ⛓️ Blockchain
participant DB as 🗄️ БД
U->>B: 1. Запрос на вывод
B->>DB: 2. Проверка баланса
DB-->>B: 3. Баланс достаточен
B->>DB: 4. Создание pending withdrawal
B-->>U: 5. Статус: ожидает одобрения
rect rgb(255, 255, 220)
Note over A,B: Одобрение администратором
A->>B: 6. Одобрение вывода
B->>F: 7. Отправка в Fordefi
end
rect rgb(220, 255, 220)
Note over F: Multi-sig одобрение
F->>F: 8. Внутренние проверки
F->>BC: 9. Выполнение транзакции
end
F->>B: 10. Webhook: выполнено
B->>DB: 11. Обновление статуса
B-->>U: 12. Вывод завершён
Контроли безопасности:
- [FIN-001] Валидация баланса перед выводом
- [FIN-002] Атомарная запись транзакции (append-only)
- [FIN-003] Обязательное одобрение администратора
- [FIN-004] Fordefi multi-sig (внешний контроль)
- [FIN-006] Полный audit trail
- [HOOK-001] Верификация webhook Fordefi
3. Операции администратора¶
3.1 Аутентификация администратора¶
sequenceDiagram
participant A as 👑 Админ
participant B as ⚙️ Backend
participant C as 📋 Config
participant S as 🔐 Supabase
A->>S: 1. Вход через Supabase
S-->>A: 2. Supabase JWT
A->>B: 3. POST /api/auth/supabase/login
B->>S: 4. Верификация JWT
S-->>B: 5. JWT валиден
B->>C: 6. Проверка admin whitelist
C-->>B: 7. Email в списке админов
B-->>A: 8. Admin JWT токен
Контроли безопасности:
- [AUTHZ-002] Config-based admin whitelist
- [AUTHZ-001] Отдельный тип AdminClaims токена
- [AUTH-004] Верификация Supabase JWT
3.2 Одобрение вывода средств¶
sequenceDiagram
participant A as 👑 Админ
participant M as 🛡️ Middleware
participant S as ⚙️ Service
participant DB as 🗄️ БД
A->>M: POST /api/admin/withdrawals/{id}/approve
Note right of A: Authorization: Bearer <AdminJWT>
rect rgb(255, 240, 240)
Note over M: Проверки безопасности
M->>M: 1. Валидация AdminJWT
M->>M: 2. Проверка IsAdmin()
M->>M: 3. Проверка permissions
end
M->>S: 4. Одобрить вывод
S->>DB: 5. Проверка существования
DB-->>S: 6. Withdrawal найден
S->>DB: 7. Обновление статуса
S->>DB: 8. Логирование действия админа
S-->>A: 200 OK
Контроли безопасности:
- [AUTHZ-001] Требуется AdminClaims
- [AUTHZ-002] Проверка admin whitelist
- [AUTHZ-005] Валидация permissions
- [DATA-004] Логирование действий админа
4. Хранение данных¶
4.1 Классификация чувствительных данных¶
flowchart TB
subgraph Critical["🔴 КРИТИЧНЫЕ (никогда не логируются)"]
JWT["JWT_SECRET"]
API["API ключи<br/>Fordefi, Crypto2B, Supabase"]
DBCred["Учётные данные БД"]
end
subgraph Sensitive["🟡 ЧУВСТВИТЕЛЬНЫЕ (контроль доступа)"]
Email["Email пользователей"]
Balance["Балансы"]
TxDetails["Детали транзакций"]
Addresses["Адреса вывода"]
end
subgraph Internal["🟢 ВНУТРЕННИЕ (стандартный доступ)"]
TxID["ID транзакций"]
Timestamps["Timestamps"]
Status["Коды статусов"]
end
subgraph Public["⚪ ПУБЛИЧНЫЕ (без защиты)"]
Strategies["Описания стратегий"]
APY["APY ставки"]
Stats["Статистика платформы"]
end
4.2 Схема базы данных (таблицы, связанные с безопасностью)¶
erDiagram
users {
uuid id PK
varchar email UK "NOT NULL - идентификатор"
varchar full_name
varchar status "DEFAULT 'active'"
timestamptz created_at
timestamptz updated_at
}
transactions {
uuid id PK
uuid user_id FK
varchar type "NOT NULL"
decimal amount "NOT NULL"
varchar currency "NOT NULL"
varchar status "NOT NULL"
varchar blockchain_tx_hash
timestamptz created_at "Immutable"
}
withdrawal_requests {
uuid id PK
uuid user_id FK
decimal amount "CHECK > 0"
varchar to_address "CHECK regex"
varchar status "State machine"
uuid admin_id "Audit trail"
varchar fordefi_tx_id
varchar blockchain_tx_hash
timestamptz created_at
timestamptz updated_at
}
users ||--o{ transactions : "user_id"
users ||--o{ withdrawal_requests : "user_id"
Особенности безопасности:
transactions— append-only, без soft deletewithdrawal_requests— state machine для статусов- Все FK с каскадным удалением отключены
- Email с UNIQUE constraint
5. Коммуникация с внешними сервисами¶
5.1 Supabase Auth¶
flowchart LR
subgraph Backend
B[Backend API]
end
subgraph Supabase["Supabase (SOC 2)"]
Auth[Auth Service]
JWKS[JWKS Endpoint]
end
B -->|HTTPS| Auth
B -->|Verify tokens| JWKS
style Supabase fill:#e8f5e9
| Параметр | Значение |
|---|---|
| Направление | Backend → Supabase |
| Протокол | HTTPS |
| Аутентификация | Supabase project keys |
| Данные | JWT токены, профили пользователей |
| Безопасность | JWKS верификация, TLS |
5.2 Fordefi¶
flowchart LR
subgraph Backend
B[Backend API]
WH[Webhook Handler]
end
subgraph Fordefi["Fordefi (Enterprise)"]
API[Fordefi API]
Custody[Custody Service]
end
B -->|"API Key + HTTPS"| API
Custody -->|"Webhook + Signature"| WH
style Fordefi fill:#fff3e0
| Параметр | Значение |
|---|---|
| Направление | Backend ↔ Fordefi |
| Протокол | HTTPS |
| Аутентификация | API key |
| Данные | Запросы на вывод, статусы транзакций |
| Безопасность | API key auth, подписи webhook, TLS |
5.3 Crypto2B¶
flowchart LR
subgraph Backend
B[Backend API]
WH[Webhook Handler]
end
subgraph Crypto2B["Crypto2B"]
API[Crypto2B API]
Monitor[Deposit Monitor]
end
B -->|"API Key + HTTPS"| API
Monitor -->|"Webhook + Signature"| WH
style Crypto2B fill:#e3f2fd
| Параметр | Значение |
|---|---|
| Направление | Backend ↔ Crypto2B |
| Протокол | HTTPS |
| Аутентификация | API key |
| Данные | Депозитные адреса, подтверждения депозитов |
| Безопасность | API key auth, подписи webhook, TLS |