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