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

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

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

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

Claim auth_time в id_token — момент завершения подтверждения. Свежесть определяете вы: сравните auth_time с текущим временем и решите, укладывается ли он в приемлемое для этой операции окно.
Не доверяйте своей локальной куке. Признак свежего подтверждения — auth_time из нового id_token, а не наличие сессии в вашем приложении: сессия говорит лишь о том, что человек когда-то вошёл.
max_age ядро не читает. Стандартный маркер OIDC max_age=0 посылать не вредно, но на поведение Veriqa он не влияет — не стройте на нём логику. Механизм свежести здесь один: новый authorize плюс проверка auth_time.

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

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

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

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

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

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

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

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