# N8N Workflow для SMS верификации ## Текущая архитектура ``` Frontend (JS) → PHP (sms-verify.php) → Redis + n8n (только отправка SMS) ``` ## Предлагаемая архитектура ``` Frontend (JS) → n8n Webhook → Redis + SMS отправка (всё в n8n) ``` ## Workflow 1: Отправка SMS кода **Webhook URL:** `https://n8n.clientright.pro/webhook/sms-send` ### Шаги: 1. **Webhook Trigger** (POST) - Принимает: `{ "phonenumber": "+79262306381" }` 2. **Нормализация номера телефона** - Убрать пробелы, скобки, дефисы - Убрать +7 или 8 в начале - Результат: `9262306381` 3. **Проверка Rate Limit (Redis)** - Ключ: `sms:ratelimit:send:9262306381` - Если значение >= 5 → ошибка "Превышен лимит" - Иначе → увеличить счетчик (TTL: 1 час) 4. **Генерация кода** - 6-значный случайный код: `106574` 5. **Сохранение кода в Redis** - Ключ: `sms:code:9262306381` - Значение: `106574` - TTL: 600 секунд (10 минут) 6. **Отправка SMS (HTTP Request)** - URL: API SMS провайдера (SigmaSMS или другой) - Метод: POST - Body: `{ "phone": "9262306381", "text": "Код подтверждения: 106574" }` 7. **Обработка ошибок** - Если SMS не отправилось → удалить код из Redis - Вернуть ошибку 8. **Ответ** ```json { "success": true, "message": "Код отправлен на ваш номер телефона" } ``` --- ## Workflow 2: Проверка SMS кода **Webhook URL:** `https://n8n.clientright.pro/webhook/sms-verify` ### Шаги: 1. **Webhook Trigger** (POST) - Принимает: `{ "phonenumber": "+79262306381", "code": "106574" }` 2. **Нормализация номера телефона** - Аналогично workflow 1 3. **Проверка Rate Limit для попыток (Redis)** - Ключ: `sms:ratelimit:attempts:9262306381` - Если значение >= 10 → ошибка "Превышено количество попыток" - Иначе → увеличить счетчик (TTL: 15 минут) 4. **Чтение кода из Redis** - Ключ: `sms:code:9262306381` - Если не найден → ошибка "Код не найден или истек" 5. **Сравнение кодов** - Если `введенный код !== сохраненный код` → ошибка "Неверный код" 6. **Успешная верификация** - Удалить код из Redis: `sms:code:9262306381` - Удалить счетчик попыток: `sms:ratelimit:attempts:9262306381` - Создать токен верификации: `sms:verified:9262306381` = `random_token` (TTL: 1 час) 7. **Ответ** ```json { "success": true, "message": "Код подтвержден", "token": "abc123def456..." } ``` --- ## Workflow 3: Проверка статуса верификации **Webhook URL:** `https://n8n.clientright.pro/webhook/sms-check-verified` ### Шаги: 1. **Webhook Trigger** (POST) - Принимает: `{ "phonenumber": "+79262306381", "token": "abc123..." }` 2. **Нормализация номера** 3. **Проверка токена в Redis** - Ключ: `sms:verified:9262306381` - Если токен совпадает → `verified: true` - Иначе → `verified: false` 4. **Ответ** ```json { "success": true, "verified": true } ``` --- ## Преимущества переноса в n8n 1. ✅ **Визуализация** - видно весь процесс на графике 2. ✅ **Логирование** - все шаги логируются автоматически 3. ✅ **Мониторинг** - видно ошибки и задержки 4. ✅ **Гибкость** - легко добавить новые шаги (например, уведомления в Telegram) 5. ✅ **Тестирование** - можно тестировать каждый шаг отдельно 6. ✅ **Масштабируемость** - легко добавить несколько SMS провайдеров с fallback --- ## Изменения в PHP коде После переноса в n8n, `sms-verify.php` станет простым прокси: ```php // sms-verify.php?action=send // Просто перенаправляет на n8n webhook // sms-verify.php?action=verify // Просто перенаправляет на n8n webhook ``` Или можно вообще убрать PHP и вызывать n8n напрямую из JS.