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