Двухфакторная авторизация операций

Описание механизма

Методы использующие двухфакторное подтверждение операций отмечены в документации красным тэгом 2FA.

В качестве второго фактора выступает фактор владения покупателем частного ресурса(телефон, почта). Настройка 2FA выполняется в личном кабинете и состоит из двух частей:

image-1741593780235.png

Каждое событие проверяется отдельно. Попытка отправки кода выполняется через канал в порядке указания его в списке каналов, в зависимости от наличия канала в конкретном запросе или в профиле клиента.

Пример: Установлена настройка проверки фактора владения при регистрации клиента. Порядок каналов отправки: Телефон -> Почта. В запросе регистрации телефон не передан, но есть адрес электронной почты. При таких вводных отправка кода будет выполняться на почту, т.к. определить телефон не представляется возможным. При тех же настройках и выполнении запроса идентификации клиента, если в карточке клиента есть телефон, отправка произойдет на телефон, как более приоритетный канал отправки.

Описание протокола

Протокол построен на сессионной модели. Любой защищенный запрос(запрос требующий 2FA) при установленной настройке для соответствующей операции будет начинать сессию работы с пользователем в определенном магазине.

Если для защищенного метода установлена настройка и список каналов отправки не пустой, выполняется проверки:

{
  "success": true,
  "message": "OK",
  "data": {
    "session": {
      "id": "081ff88e5d1f925d33926fb0f580e49485fd231b", // Идентификатор сессии
      "issuer": "79030000001",
      "issuer_location": "",
      "confirmed": false,
      "created_at": null,
      "updated_at": null
    },
    "instruction": {
      "channel": "phone", // Канал, на который выполнилась отправка кода подтверждения
      "reciever": "79030000001", // Идентификатор получателя(зависит от канала)
      "secret": "dummy-secret", // Секрет клиентского приложения, используется для проверки введенного кода подтверждения
      "duration": 120, // Время жизни кода подтверждения в секундах
      "available_channels": [ // Доступные в текущем контексте каналы отправки кодов подтверждения
        "phone"
      ]
    }
  }
}

Таким образом начинаться сессия может любым методом, подтверждаться любым методом, любой метод в цепочке вызовов после подтверждения больше не требует подтверждения.

@startuml !theme aws-orange  participant "Покупатель" as buyer participant "Интеграционный модуль" as module participant "Сервис" as service  module -> service ++#yellow: Первый запрос в сессии  service->module: Инструкции + (x-totp-session-id, x-totp-secret) service-[#green]->buyer: x-totp-code service-[#green]->module: x-totp-session-id  buyer-[#green]->module: Называет код  module->service: Повторный запроса + (x-totp-code, x-totp-secret, x-totp-session-id)  service->service: Валидирует код activate service #green service->service: Выполняет операцию  service -> module: Возвращает результат повторного запроса  module -> service: Последующие запросы в сессии + (x-totp-session-id) service -> service: Сессия подтверждена? service -> module: Результат последующих операций  module -> service: Последняя операция в сессии + (x-totp-session-id, x-totp-expire) service -> service: Завершить сессию deactivate service deactivate service service -> module: Последний ответ в сессии  @enduml

Описание развертывания

Сервис использует переменные окружения связанные с отправкой SMS4B. Также используются две переменные окружения:

TOTP_SESSION_TTL_MIN

Время жизни сессии подтвержденной сессии в минутах. Не менее 10 минут, если указано значение меньше - сессия будет жить 10 минут. Значение по-умолчанию: 10 минут.

TOTP_SESSION_VACUUM_INTERVAL_MIN

Интервал, с которым сервис выполняет очистку просроченных сессий. Не менее 10 минут, если указано значение меньше - сессия будет жить 10 минут. Значение по-умолчанию: 10 минут.


Revision #3
Created 3 March 2025 10:19:35 by Морозов Сергей
Updated 10 March 2025 08:03:05 by Алексей Нам