> ## Documentation Index
> Fetch the complete documentation index at: https://veriqa.app/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Подтверждение действий

> Примеры, где бэкенд просит человека подтвердить действие в мессенджере: простое подтверждение, степ-ап перед разрушительным действием и одобрение вызова инструмента ИИ-агента.

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

| Пример | Действие | Что добавляет | Адрес |
| - | - | - | - |
| `confirmation` | «Одобрить платёж 42.00 EUR в пользу ACME Ltd?» | Механизм как есть: создать, показать вход, дождаться, прочитать итог | `https://localhost:7310` |
| `step-up` | Удаление проекта, которое нельзя отменить | Подтвердить может только **владелец аккаунта**: `expected_identities` и `matched_type` | `https://localhost:7330` |
| `agent-approval` | Вызов инструмента `refund_payment` агентом поддержки | Человек в контуре: инструмент выполняется только после одобрения вызова | `https://localhost:7340` |

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

Каждый пример — один процесс в двух ролях: издатель 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 серверного подтверждения»](/docs/ru/reference/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` в [Конфигурации](/docs/ru/reference/configuration).

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

Каждому примеру нужны доверенный локальный HTTPS-сертификат (`dotnet dev-certs https --trust`) и
токен бота Telegram от [@BotFather](https://t.me/BotFather). Передавайте токен через user secrets, а
не через файл в репозитории:

```bash theme={null}
dotnet user-secrets --project samples/dotnet/inproc/confirmation set "Veriqa:Channels:Telegram:BotToken" "<token>"
dotnet user-secrets --project samples/dotnet/inproc/confirmation set "Veriqa:Channels:Telegram:Enabled" "true"
dotnet run --project samples/dotnet/inproc/confirmation
```

Для `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-ключ не нужны.

## См. также

* [Второй фактор, step-up и подтверждение действий](/docs/ru/scenarios/step-up)
* [Подтверждение действий ИИ-агентов](/docs/ru/research/agent-approvals)
* [Видео: step-up на десктопе](/docs/ru/videos/desktop-step-up)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.