Темный режим

API Auth Workflow

1. Обзор workflow

Полноценная система аутентификации с регистрацией, активацией аккаунта, восстановлением пароля и авторизацией.

Названиеapi-auth
База данныхPostgreSQL (managers, tokens, companies)
Методы6 webhook-узлов для разных операций
ИнтеграцииEmail сервис (rusender.ru)

2. POST /auth/signup

Регистрация нового менеджера и компании с отправкой письма активации.

Цепочка выполнения:

  1. Webhook (auth/signup)

    Принимает POST-запрос с параметрами:

    • body.email - email пользователя
    • body.password - пароль
    • body.firstName - имя
    • body.lastName - фамилия
    • body.phone - телефон
    • body.companyName - название компании
  2. 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
  3. get manager id

    Проверяет существование email:

    SELECT "managerId" FROM managers WHERE email = $1;
  4. get company id

    Проверяет существование компании:

    SELECT "companyId" FROM companies WHERE name = $1;
  5. Merge7

    Объединяет результаты проверок.

  6. If4

    Проверяет существование email или компании:

    Условие: $json.companyId пусто И $json.managerId пусто
  7. Ветка 1 (уникальные данные):

    1. bcrypt pass hash

      Хэширует пароль с помощью bcrypt:

      hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
    2. add company

      Создает новую компанию:

      INSERT INTO companies (name) VALUES ($1) RETURNING "companyId";
    3. Merge

      Объединяет данные компании и хэш пароля.

    4. add manager

      Создает менеджера:

      INSERT INTO managers 
      (companyId, email, firstName, lastName, password, phone) 
      VALUES ($1, $2, $3, $4, $5, $6);
    5. add email activation token

      Генерирует токен активации:

      INSERT INTO "tokens" ("userId", "expires_at")
      VALUES ($1, NOW() + INTERVAL '72 hours')
      RETURNING "token" AS "auth_token";
    6. Merge1

      Объединяет данные менеджера и токена.

    7. EMAIL

      Отправляет письмо активации через rusender.ru:

      Параметры письма:

      • Шаблон: 51256 (Активация аккаунта)
      • Тема: "Активация аккаунта"
      • Параметры:
        user-name: {{firstName}}
        user-surname: {{lastName}}
        user-token: {{auth_token}}
    8. Respond success

      Возвращает статус успешной регистрации:

      {"success": true}
  8. Ветка 2 (ошибки):

    1. Switch2

      Определяет тип ошибки:

      • Если существует managerId - "email already exists"
      • Если существует companyId - "company already exists"

Особенности:

  • Пароль хэшируется перед сохранением
  • Токен активации действителен 72 часа
  • Проверка уникальности email и названия компании

3. POST /auth/login

Аутентификация пользователя по email и паролю.

Цепочка выполнения:

  1. Webhook (auth/login)

    Принимает POST-запрос с параметрами:

    • body.email - email пользователя
    • body.password - пароль
  2. Edit Fields7

    Извлекает параметры:

    email = $json.body.email
    pass = $json.body.password
  3. get manager data

    Получает данные пользователя:

    SELECT * FROM managers WHERE email = $1;
  4. If manager true

    Проверяет существование пользователя:

    Условие: $json.managerId не пусто
  5. Ветка 1 (пользователь существует):

    1. Merge9

      Объединяет данные запроса и пользователя.

    2. pass hashed and check

      Проверяет пароль и определяет статус:

      Логика работы:

      1. Сравнивает хэш пароля из БД с введенным
      2. Устанавливает passCheck: 'success' или 'fail'
      3. Определяет switch:
        • 1 - успешная аутентификация, аккаунт активирован
        • 2 - успешная аутентификация, аккаунт не активирован
        • 3 - неверный пароль
    3. Switch4

      Обрабатывает разные сценарии:

      • switch=1: успешный вход
      • switch=2: аккаунт не активирован
      • switch=3: неверный пароль
    4. get company token

      Получает токен компании для успешного входа:

      SELECT "token" FROM companies WHERE "companyId" = $1;
    5. Edit Fields8

      Добавляет company_token к ответу.

    6. Edit Fields9

      Формирует итоговый ответ:

      {
        "status": "success",
        "manager_token": "токен_менеджера",
        "managerId": "id_менеджера",
        "company_token": "токен_компании"
      }
    7. status login success

      Возвращает данные аутентифицированного пользователя.

  6. Ветка 2 (ошибки):

    1. status login-error

      Возвращает ошибку аутентификации:

      {"status": "login-error"}

Особенности безопасности:

  • Используется bcrypt для проверки паролей
  • Раздельные сценарии для активированных и неактивированных аккаунтов
  • Возвращаются только необходимые данные

4. GET /auth/activation

Активация аккаунта по токену из email.

Цепочка выполнения:

  1. Webhook (auth/activation)

    Принимает GET-запрос с параметром:

    • query.token - токен активации
  2. Edit Fields1

    Извлекает токен:

    query.token = $json.query.token
  3. 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 - активен/просрочен

  4. If

    Проверяет валидность токена:

    Условие: $json.userId не пусто
  5. Ветка 1 (валидный токен):

    1. Postgres7

      Получает данные пользователя:

      SELECT * FROM "managers" WHERE "managerId" = $1;
    2. Merge2

      Объединяет данные токена и пользователя.

    3. Code1

      Определяет switch для дальнейшей обработки:

      Логика работы:

      • switch=1: аккаунт уже активирован
      • switch=2: токен активен, аккаунт не активирован
      • switch=3: токен просрочен
    4. Switch

      Обрабатывает разные сценарии:

      • switch=1: возвращает "token already-activated"
      • switch=2: активирует аккаунт
      • switch=3: возвращает "token expired"
    5. Postgres6

      Активирует аккаунт:

      UPDATE "managers" SET "activated" = true WHERE "managerId" = $1;
    6. Token success

      Возвращает статус успешной активации:

      {"activated": true}
  6. Ветка 2 (невалидный токен):

    1. token error

      Возвращает ошибку:

      {"token": "error"}

Особенности:

  • Проверка срока действия токена на уровне БД
  • Защита от повторной активации
  • Разные сообщения для разных ошибок

5. GET /auth/activation-retry

Повторная отправка письма активации.

Цепочка выполнения:

  1. Webhook (auth/activation-retry)

    Принимает GET-запрос с параметром:

    • query.email - email пользователя
    • query.token - токен (опционально)
  2. Switch3

    Определяет тип запроса:

    • Если есть token - обновление токена
    • Если есть email - повторная отправка
  3. Ветка 1 (по токену):

    1. Edit Fields2

      Извлекает токен:

      query.token = $json.query.token
    2. Postgres9

      Проверяет токен (аналогично auth/activation).

    3. Postgres8

      Получает данные пользователя.

    4. Postgres3

      Генерирует новый токен:

      INSERT INTO "tokens" ("userId", "expires_at")
      VALUES ($1, NOW() + INTERVAL '72 hours')
      RETURNING "token" AS "auth_token";
    5. Merge3

      Объединяет данные пользователя и токена.

    6. EMAIL1

      Отправляет письмо активации.

    7. Respond to Webhook1

      Возвращает статус:

      {"success": true}
  4. Ветка 2 (по email):

    1. Edit Fields6

      Извлекает email:

      query.email = $json.query.email
    2. Postgres17

      Проверяет существование пользователя.

    3. If5

      Обрабатывает результат:

      • Если пользователь существует - генерирует новый токен
      • Если не существует - возвращает ошибку

Особенности:

  • Поддержка двух способов запроса
  • Автоматическая генерация нового токена
  • Проверка существования пользователя

6. POST /auth/reset

Запрос на восстановление пароля.

Цепочка выполнения:

  1. Webhook (auth/reset)

    Принимает POST-запрос с параметром:

    • body.email - email пользователя
  2. Switch1

    Определяет тип запроса (по email или токену).

  3. Edit Fields3

    Извлекает email:

    query.email = $json.body.email
  4. Postgres10

    Проверяет существование пользователя:

    SELECT * FROM "managers" WHERE "email" = $1;
  5. If3

    Проверяет результат:

    Условие: $json.managerId не пусто
  6. Ветка 1 (пользователь существует):

    1. Postgres5

      Генерирует токен восстановления:

      INSERT INTO "tokens" ("userId", "expires_at")
      VALUES ($1, NOW() + INTERVAL '72 hours')
      RETURNING "token" AS "auth_token";
    2. Merge4

      Объединяет данные пользователя и токена.

    3. EMAIL2

      Отправляет письмо восстановления:

      Параметры письма:

      • Шаблон: 51263 (Восстановление пароля)
      • Тема: "Восстановление пароля"
      • Параметры:
        user-name: {{firstName}}
        user-surname: {{lastName}}
        user-token: {{auth_token}}
    4. Respond success true

      Возвращает статус:

      {"success": true}
  7. Ветка 2 (ошибки):

    1. Respond to Webhook11

      Возвращает ошибку:

      {"success": false}

7. POST /auth/newpass/

Установка нового пароля по токену восстановления.

Цепочка выполнения:

  1. Webhook (auth/newpass/)

    Принимает POST-запрос с параметрами:

    • body.recovery_token - токен восстановления
    • body.password - новый пароль
  2. Edit Fields5

    Извлекает параметры:

    query.token = $json.body.recovery_token
    query.password = $json.body.password
  3. Postgres12

    Проверяет токен:

    SELECT 
        "userId",
        CASE WHEN "expires_at" > NOW() THEN 'active' ELSE 'expired' END AS status
    FROM "tokens" WHERE "token" = $1 LIMIT 1;
  4. If2

    Проверяет валидность токена:

    Условие: $json.userId не пусто И $json.status == 'active'
  5. Ветка 1 (валидный токен):

    1. Code2

      Хэширует новый пароль:

      hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
    2. Merge5

      Объединяет данные.

    3. Postgres14

      Обновляет пароль:

      UPDATE "managers" SET "password" = $2 WHERE "managerId" = $1;
    4. Postgres15

      Деактивирует токен:

      UPDATE "tokens" SET "expires_at" = NOW() WHERE "token" = $1;
    5. Merge6

      Объединяет результаты.

    6. Respond to Webhook10

      Возвращает статус:

      {"status": "success"}
  6. Ветка 2 (ошибки):

    1. Respond to Webhook9

      Возвращает ошибку:

      {"status": "expired"}

Особенности безопасности:

  • Токен одноразовый (деактивируется после использования)
  • Пароль хэшируется перед сохранением
  • Проверка срока действия токена

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}