Skip to main content
Здесь транзакцию начинает бэкенд, а не браузер: он просит человека подтвердить действие в мессенджере и поступает по итогу. Входа и редиректа браузера нет. Три примера лежат в samples/dotnet/inproc/ репозитория (veriqa.app/source) под лицензией MIT.

Как устроен каждый

Каждый пример — один процесс в двух ролях: издатель Veriqa (встроенный) и бэкенд, который обращается к нему только через публичный HTTP API. Направьте бэкенд на отдельно развёрнутую Veriqa — он будет работать так же.
  1. POST /connect/token с grant_type=client_credentials.
  2. POST /api/transaction/confirmation с объявленным action_type и его slot_values.
  3. Страница показывает channel_entry.qr — картинку QR, которую возвращает API, — для сканирования телефоном.
  4. Бэкенд опрашивает GET /api/transaction/{id}/result.
  5. При confirmed транзакцию можно один раз обменять на id_token подтвердившего (grant_type=urn:veriqa:params:oauth:grant-type:confirmation).
Полный контракт — поля, ошибки, обмен — в справочнике «API серверного подтверждения».

Настройка, на которой всё держится

В записи клиента бэкенда в appsettings.json:
  • AllowClientCredentials: true — бэкенд может получить токен для API (нужен ClientSecret);
  • AllowConfirmationTokenGrant: true и openid в AllowedScopes — шаг 5;
  • MessageTemplates:<тип действия> — объявление действия: Contract:Slots и Templates. Его место — в записи клиента; тип действия, объявленный только на уровне хоста, отклоняется с action_type_unknown;
  • для step-up ещё IdentityMatchComparableTypes — объявление личности, которая сверяется с подтвердившим. Без него запрос отклоняется с candidate_type_undeclared.
Секция хоста задаёт Veriqa:Channels:OutcomeNotice:DisplayIntent = NewMessage: квитанция приходит отдельным сообщением, а вопрос с формулировкой действия остаётся в переписке. См. OutcomeNotice в Конфигурации.

Запуск примера

Каждому примеру нужны доверенный локальный HTTPS-сертификат (dotnet dev-certs https --trust) и токен бота Telegram от @BotFather. Передавайте токен через user secrets, а не через файл в репозитории:
Для step-up и agent-approval замените путь проекта. В Development бот работает в режиме polling, публичный адрес не нужен. Без включённого канала создание подтверждения отвечает 503 channel_display_failed. Что попробовать в каждом:
  • confirmation — нажмите Ask for approval и подтвердите в боте: страница покажет Outcome: confirmed и claims id_token.
  • step-up — удалите проект: первый подтвердивший становится владельцем. Удалите другой с другого аккаунта Telegram: подтверждение пройдёт, но страница ответит Not deleted — confirmed, but not by the owner.
  • agent-approval — нажмите Hand the ticket to the agent: агент остановится на refund_payment, пока вы не одобрите вызов. Во втором прогоне откажите: возврат не выполнится, и агент сообщит клиенту, что с ним свяжется коллега. Агент идёт по фиксированному плану, поэтому ни модель, ни API-ключ не нужны.

См. также