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