> ## 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.

# Второй фактор, step-up и подтверждение действий

> Свежее подтверждение перед чувствительной операцией: новый authorize, проверка auth_time и почему локальной куке доверять нельзя.

Чувствительные действия — удаление важных данных, смена реквизитов, выдача кому-то доступа,
подтверждение платежа — стоит подтверждать заново, даже если пользователь уже вошёл. Veriqa
делает это одним нажатием в мессенджере, а не кодом из SMS.

## Что отправляете

Новый authorize-запрос **перед самим действием**. Ничего специального в нём нет:

```http theme={null}
GET /connect/authorize
  ?client_id=my-app
  &response_type=code
  &scope=openid
  &redirect_uri=https://app.example.com/callback/step-up
  &state=…
```

## Что проверяете

Claim `auth_time` в `id_token` — момент завершения подтверждения. Свежесть определяете вы:
сравните `auth_time` с текущим временем и решите, укладывается ли он в приемлемое для этой
операции окно.

<Warning>
  **Не доверяйте своей локальной куке.** Признак свежего подтверждения — `auth_time` из нового
  `id_token`, а не наличие сессии в вашем приложении: сессия говорит лишь о том, что человек
  когда-то вошёл.
</Warning>

<Warning>
  **`max_age` ядро не читает.** Стандартный маркер OIDC `max_age=0` посылать не вредно, но на
  поведение Veriqa он не влияет — не стройте на нём логику. Механизм свежести здесь один: новый
  authorize плюс проверка `auth_time`.
</Warning>

## Почему это работает

Обходить нечего: долгоживущей сессии у issuer'а нет. Единственная кука между callback и authorize
одноразовая и снимается сразу при выдаче кода, поэтому каждый свежий authorize-запрос заново
спрашивает подтверждение в канале.

## Усиление: два разных канала

Одну чувствительную операцию можно подтвердить в **двух разных доверенных каналах** — например
WhatsApp плюс почта. Сузить канал конкретного запроса помогает параметр `acr_values`:

```
&acr_values=channel:whatsapp
```

Несколько значений разделяются пробелом — тогда пользователь выбирает из перечисленных.

## Обогащение профиля попутно

Подтверждение — удобный момент, чтобы получить недостающие данные: если запросить `scope=email`
или `phone`, приложение получает **верифицированный** контакт прямо в ходе подтверждения, без
отдельной формы и отдельной проверки. Состав claims зависит от канала.

## Чего для этого нет

* **нет параметра «сценарий»** — Veriqa не различает вход, step-up и подтверждение операции;
* **нет серверной проверки свежести** — окно приемлемости `auth_time` задаёте и проверяете вы;
* **отдельный транзакционный вход есть, но это не API для step-up.**
  `POST /api/transaction/confirmation` создаёт транзакцию подтверждения (приложение
  аутентифицируется по client credentials и получает `transaction_id` с точкой входа для
  пользователя) под объявленный тип действия и его типизированные слоты. Step-up на этой странице
  собирается повторным authorize и работает без него.


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