- Перенесена проверка SMS кода в n8n webhook (N8N_SMS_VERIFY_WEBHOOK) - Упрощен формат ответа: убран токен, только success/message - sms-verify.php теперь проксирует запросы на n8n - Обновлен JS код: убрано использование токена - Обновлена документация с упрощенным форматом ответа - Протестировано: верный и неверный коды работают корректно
151 lines
4.9 KiB
Markdown
151 lines
4.9 KiB
Markdown
# 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.
|