Files
erv-ticket-dev/docs/n8n_sms_workflow.md

151 lines
4.9 KiB
Markdown
Raw Permalink Normal View History

# 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.