Files
erv-ticket-dev/docs/n8n_redis_example.md
Fedor ed4270312e feat: SMS verification через n8n webhook
- Перенесена проверка SMS кода в n8n webhook (N8N_SMS_VERIFY_WEBHOOK)
- Упрощен формат ответа: убран токен, только success/message
- sms-verify.php теперь проксирует запросы на n8n
- Обновлен JS код: убрано использование токена
- Обновлена документация с упрощенным форматом ответа
- Протестировано: верный и неверный коды работают корректно
2026-01-15 18:11:18 +03:00

202 lines
4.9 KiB
Markdown

# Пример использования Redis в n8n через Webhook
## Как это работает
```
Webhook (точка входа) → Redis Node (чтение/запись) → Ответ
```
## Workflow: Проверка SMS кода
### Структура:
```
1. Webhook Trigger
2. Function Node (нормализация номера)
3. Redis Node (GET) - читаем код из Redis
4. Function Node (сравнение кодов)
5. Redis Node (DEL) - удаляем код после проверки
6. Respond to Webhook
```
### Детализация:
#### Шаг 1: Webhook Trigger
- **URL:** `/webhook/sms-verify`
- **Method:** POST
- **Body:**
```json
{
"phonenumber": "+79262306381",
"code": "106574"
}
```
#### Шаг 2: Function Node - Нормализация
```javascript
// Код для Function Node
const phone = $input.item.json.phonenumber || '';
const cleaned = phone
.replace(/[() -]/g, '')
.replace(/^(\+?7|8)/, '');
return {
json: {
phone_cleaned: cleaned,
code: $input.item.json.code
}
};
```
#### Шаг 3: Redis Node - Чтение кода
- **Operation:** Get
- **Key:** `sms:code:{{ $json.phone_cleaned }}`
- **Результат:**
```json
{
"phone_cleaned": "9262306381",
"code": "106574",
"stored_code": "106574" // из Redis
}
```
#### Шаг 4: Function Node - Сравнение
```javascript
// Код для Function Node
const inputCode = $input.item.json.code;
const storedCode = $input.item.json.stored_code;
if (!storedCode) {
return {
json: {
success: false,
message: "Код не найден или истек"
}
};
}
if (inputCode !== storedCode) {
return {
json: {
success: false,
message: "Неверный код"
}
};
}
// Код верный - продолжаем
return {
json: {
success: true,
phone_cleaned: $input.item.json.phone_cleaned
}
};
```
#### Шаг 5: Redis Node - Удаление кода
- **Operation:** Delete
- **Key:** `sms:code:{{ $json.phone_cleaned }}`
#### Шаг 6: Redis Node - Создание токена
- **Operation:** Set
- **Key:** `sms:verified:{{ $json.phone_cleaned }}`
- **Value:** `{{ $json.token }}` (генерируется в Function Node)
- **TTL:** 3600 секунд
#### Шаг 7: Respond to Webhook
```json
{
"success": true,
"message": "Код подтвержден",
"token": "abc123..."
}
```
---
## Workflow: Отправка SMS кода
### Структура:
```
1. Webhook Trigger
2. Function Node (нормализация)
3. Redis Node (GET) - проверка rate limit
4. Function Node (генерация кода)
5. Redis Node (SETEX) - сохранение кода
6. HTTP Request - отправка SMS
7. Respond to Webhook
```
### Детализация:
#### Шаг 3: Redis Node - Проверка rate limit
- **Operation:** Get
- **Key:** `sms:ratelimit:send:{{ $json.phone_cleaned }}`
- **Если значение >= 5** → ошибка через IF Node
#### Шаг 5: Redis Node - Сохранение кода
- **Operation:** Set with Expiration
- **Key:** `sms:code:{{ $json.phone_cleaned }}`
- **Value:** `{{ $json.code }}`
- **TTL:** 600 секунд (10 минут)
#### Шаг 6: HTTP Request - Отправка SMS
- **Method:** POST
- **URL:** (SMS API провайдера)
- **Body:**
```json
{
"phone": "{{ $json.phone_cleaned }}",
"text": "Код подтверждения: {{ $json.code }}"
}
```
---
## Настройка Redis в n8n
### Credentials:
1. Зайти в n8n → Credentials → New
2. Выбрать "Redis"
3. Заполнить:
- **Host:** `crm.clientright.ru`
- **Port:** `6379`
- **Password:** (из .env или пусто)
- **Database:** `0` (по умолчанию)
### Использование в Node:
1. Добавить **Redis Node** в workflow
2. Выбрать созданные credentials
3. Выбрать операцию (Get, Set, Set with Expiration, Delete, etc.)
4. Указать ключ (можно использовать переменные: `sms:code:{{ $json.phone_cleaned }}`)
---
## Преимущества
**Всё в одном месте** - webhook принимает запрос, Redis Node читает/пишет
**Визуализация** - видно весь процесс на графике
**Логирование** - n8n автоматически логирует все операции
**Обработка ошибок** - можно добавить IF Nodes для проверок
**Тестирование** - можно тестировать каждый шаг отдельно
---
## Пример полного workflow (JSON для импорта в n8n)
Можно создать workflow вручную или импортировать готовый JSON (если нужно, могу создать).