API Auth Workflow
1. Обзор workflow
Полноценная система аутентификации с регистрацией, активацией аккаунта, восстановлением пароля и авторизацией.
| Название | api-auth |
|---|---|
| База данных | PostgreSQL (managers, tokens, companies) |
| Методы | 6 webhook-узлов для разных операций |
| Интеграции | Email сервис (rusender.ru) |
2. POST /auth/signup
Регистрация нового менеджера и компании с отправкой письма активации.
Цепочка выполнения:
-
Webhook (auth/signup)
Принимает POST-запрос с параметрами:
body.email- email пользователяbody.password- парольbody.firstName- имяbody.lastName- фамилияbody.phone- телефонbody.companyName- название компании
-
Edit Fields
Извлекает параметры из запроса:
query.email = $json.body.email query.password = $json.body.password query.firstName = $json.body.firstName query.lastName = $json.body.lastName query.phone = $json.body.phone query.companyName = $json.body.companyName -
get manager id
Проверяет существование email:
SELECT "managerId" FROM managers WHERE email = $1; -
get company id
Проверяет существование компании:
SELECT "companyId" FROM companies WHERE name = $1; -
Merge7
Объединяет результаты проверок.
-
If4
Проверяет существование email или компании:
Условие: $json.companyId пусто И $json.managerId пусто -
Ветка 1 (уникальные данные):
-
bcrypt pass hash
Хэширует пароль с помощью bcrypt:
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()) -
add company
Создает новую компанию:
INSERT INTO companies (name) VALUES ($1) RETURNING "companyId"; -
Merge
Объединяет данные компании и хэш пароля.
-
add manager
Создает менеджера:
INSERT INTO managers (companyId, email, firstName, lastName, password, phone) VALUES ($1, $2, $3, $4, $5, $6); -
add email activation token
Генерирует токен активации:
INSERT INTO "tokens" ("userId", "expires_at") VALUES ($1, NOW() + INTERVAL '72 hours') RETURNING "token" AS "auth_token"; -
Merge1
Объединяет данные менеджера и токена.
-
EMAIL
Отправляет письмо активации через rusender.ru:
Параметры письма:
- Шаблон: 51256 (Активация аккаунта)
- Тема: "Активация аккаунта"
- Параметры:
user-name: {{firstName}} user-surname: {{lastName}} user-token: {{auth_token}}
-
Respond success
Возвращает статус успешной регистрации:
{"success": true}
-
bcrypt pass hash
-
Ветка 2 (ошибки):
-
Switch2
Определяет тип ошибки:
- Если существует managerId - "email already exists"
- Если существует companyId - "company already exists"
-
Switch2
Особенности:
- Пароль хэшируется перед сохранением
- Токен активации действителен 72 часа
- Проверка уникальности email и названия компании
3. POST /auth/login
Аутентификация пользователя по email и паролю.
Цепочка выполнения:
-
Webhook (auth/login)
Принимает POST-запрос с параметрами:
body.email- email пользователяbody.password- пароль
-
Edit Fields7
Извлекает параметры:
email = $json.body.email pass = $json.body.password -
get manager data
Получает данные пользователя:
SELECT * FROM managers WHERE email = $1; -
If manager true
Проверяет существование пользователя:
Условие: $json.managerId не пусто -
Ветка 1 (пользователь существует):
-
Merge9
Объединяет данные запроса и пользователя.
-
pass hashed and check
Проверяет пароль и определяет статус:
Логика работы:
- Сравнивает хэш пароля из БД с введенным
- Устанавливает passCheck: 'success' или 'fail'
- Определяет switch:
- 1 - успешная аутентификация, аккаунт активирован
- 2 - успешная аутентификация, аккаунт не активирован
- 3 - неверный пароль
-
Switch4
Обрабатывает разные сценарии:
- switch=1: успешный вход
- switch=2: аккаунт не активирован
- switch=3: неверный пароль
-
get company token
Получает токен компании для успешного входа:
SELECT "token" FROM companies WHERE "companyId" = $1; -
Edit Fields8
Добавляет company_token к ответу.
-
Edit Fields9
Формирует итоговый ответ:
{ "status": "success", "manager_token": "токен_менеджера", "managerId": "id_менеджера", "company_token": "токен_компании" } -
status login success
Возвращает данные аутентифицированного пользователя.
-
Merge9
-
Ветка 2 (ошибки):
-
status login-error
Возвращает ошибку аутентификации:
{"status": "login-error"}
-
status login-error
Особенности безопасности:
- Используется bcrypt для проверки паролей
- Раздельные сценарии для активированных и неактивированных аккаунтов
- Возвращаются только необходимые данные
4. GET /auth/activation
Активация аккаунта по токену из email.
Цепочка выполнения:
-
Webhook (auth/activation)
Принимает GET-запрос с параметром:
query.token- токен активации
-
Edit Fields1
Извлекает токен:
query.token = $json.query.token -
Postgres4
Проверяет токен:
SELECT "userId", CASE WHEN "expires_at" > NOW() THEN 'active' ELSE 'expired' END AS status FROM "tokens" WHERE "token" = $1 LIMIT 1;Определяет:
- userId - ID пользователя
- status - активен/просрочен
-
If
Проверяет валидность токена:
Условие: $json.userId не пусто -
Ветка 1 (валидный токен):
-
Postgres7
Получает данные пользователя:
SELECT * FROM "managers" WHERE "managerId" = $1; -
Merge2
Объединяет данные токена и пользователя.
-
Code1
Определяет switch для дальнейшей обработки:
Логика работы:
- switch=1: аккаунт уже активирован
- switch=2: токен активен, аккаунт не активирован
- switch=3: токен просрочен
-
Switch
Обрабатывает разные сценарии:
- switch=1: возвращает "token already-activated"
- switch=2: активирует аккаунт
- switch=3: возвращает "token expired"
-
Postgres6
Активирует аккаунт:
UPDATE "managers" SET "activated" = true WHERE "managerId" = $1; -
Token success
Возвращает статус успешной активации:
{"activated": true}
-
Postgres7
-
Ветка 2 (невалидный токен):
-
token error
Возвращает ошибку:
{"token": "error"}
-
token error
Особенности:
- Проверка срока действия токена на уровне БД
- Защита от повторной активации
- Разные сообщения для разных ошибок
5. GET /auth/activation-retry
Повторная отправка письма активации.
Цепочка выполнения:
-
Webhook (auth/activation-retry)
Принимает GET-запрос с параметром:
query.email- email пользователяquery.token- токен (опционально)
-
Switch3
Определяет тип запроса:
- Если есть token - обновление токена
- Если есть email - повторная отправка
-
Ветка 1 (по токену):
-
Edit Fields2
Извлекает токен:
query.token = $json.query.token -
Postgres9
Проверяет токен (аналогично auth/activation).
-
Postgres8
Получает данные пользователя.
-
Postgres3
Генерирует новый токен:
INSERT INTO "tokens" ("userId", "expires_at") VALUES ($1, NOW() + INTERVAL '72 hours') RETURNING "token" AS "auth_token"; -
Merge3
Объединяет данные пользователя и токена.
-
EMAIL1
Отправляет письмо активации.
-
Respond to Webhook1
Возвращает статус:
{"success": true}
-
Edit Fields2
-
Ветка 2 (по email):
-
Edit Fields6
Извлекает email:
query.email = $json.query.email -
Postgres17
Проверяет существование пользователя.
-
If5
Обрабатывает результат:
- Если пользователь существует - генерирует новый токен
- Если не существует - возвращает ошибку
-
Edit Fields6
Особенности:
- Поддержка двух способов запроса
- Автоматическая генерация нового токена
- Проверка существования пользователя
6. POST /auth/reset
Запрос на восстановление пароля.
Цепочка выполнения:
-
Webhook (auth/reset)
Принимает POST-запрос с параметром:
body.email- email пользователя
-
Switch1
Определяет тип запроса (по email или токену).
-
Edit Fields3
Извлекает email:
query.email = $json.body.email -
Postgres10
Проверяет существование пользователя:
SELECT * FROM "managers" WHERE "email" = $1; -
If3
Проверяет результат:
Условие: $json.managerId не пусто -
Ветка 1 (пользователь существует):
-
Postgres5
Генерирует токен восстановления:
INSERT INTO "tokens" ("userId", "expires_at") VALUES ($1, NOW() + INTERVAL '72 hours') RETURNING "token" AS "auth_token"; -
Merge4
Объединяет данные пользователя и токена.
-
EMAIL2
Отправляет письмо восстановления:
Параметры письма:
- Шаблон: 51263 (Восстановление пароля)
- Тема: "Восстановление пароля"
- Параметры:
user-name: {{firstName}} user-surname: {{lastName}} user-token: {{auth_token}}
-
Respond success true
Возвращает статус:
{"success": true}
-
Postgres5
-
Ветка 2 (ошибки):
-
Respond to Webhook11
Возвращает ошибку:
{"success": false}
-
Respond to Webhook11
7. POST /auth/newpass/
Установка нового пароля по токену восстановления.
Цепочка выполнения:
-
Webhook (auth/newpass/)
Принимает POST-запрос с параметрами:
body.recovery_token- токен восстановленияbody.password- новый пароль
-
Edit Fields5
Извлекает параметры:
query.token = $json.body.recovery_token query.password = $json.body.password -
Postgres12
Проверяет токен:
SELECT "userId", CASE WHEN "expires_at" > NOW() THEN 'active' ELSE 'expired' END AS status FROM "tokens" WHERE "token" = $1 LIMIT 1; -
If2
Проверяет валидность токена:
Условие: $json.userId не пусто И $json.status == 'active' -
Ветка 1 (валидный токен):
-
Code2
Хэширует новый пароль:
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()) -
Merge5
Объединяет данные.
-
Postgres14
Обновляет пароль:
UPDATE "managers" SET "password" = $2 WHERE "managerId" = $1; -
Postgres15
Деактивирует токен:
UPDATE "tokens" SET "expires_at" = NOW() WHERE "token" = $1; -
Merge6
Объединяет результаты.
-
Respond to Webhook10
Возвращает статус:
{"status": "success"}
-
Code2
-
Ветка 2 (ошибки):
-
Respond to Webhook9
Возвращает ошибку:
{"status": "expired"}
-
Respond to Webhook9
Особенности безопасности:
- Токен одноразовый (деактивируется после использования)
- Пароль хэшируется перед сохранением
- Проверка срока действия токена
8. Общие компоненты
Структура БД
Таблица managers
- managerId - первичный ключ
- email - email пользователя
- firstName, lastName - имя и фамилия
- password - хэш пароля
- phone - телефон
- companyId - ссылка на компанию
- activated - флаг активации
Таблица tokens
- token - первичный ключ
- userId - ссылка на пользователя
- expires_at - срок действия
Таблица companies
- companyId - первичный ключ
- name - название компании
- token - токен для API
Интеграция с Email
Используется сервис rusender.ru с API ключом.
Используемые шаблоны:
- 51256 - Активация аккаунта
- 51263 - Восстановление пароля
Обработка ошибок
Общие сценарии ошибок:
- Неверный email или пароль - {"status": "login-error"}
- Неактивированный аккаунт - {"token": "not-activated"}
- Просроченный токен - {"token": "expired"}
- Несуществующий пользователь - {"success": false}