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

# Подтверждённая заявка без входа

> Форма на своём сайте, отправку которой пользователь подтверждает в мессенджере: сессия не создаётся, плагины CMS этого не умеют, серверный обработчик обязателен.

Второй сценарий, помимо входа: пользователь заполняет форму — заявку, вопрос, запрос обратного
звонка — и подтверждает отправку в мессенджере. Рядом с заявкой у вас появляется запись «эту
отправку подтвердил такой-то субъект в таком-то канале», а **сессия не создаётся и учётная запись
не заводится**.

<Note>
  Обработчик укладывается примерно в 250 строк PHP, **без Composer и без внешних зависимостей**;
  проверено на канале Telegram.
</Note>

## Почему это не настройка входа

<Warning>
  **Ни один OIDC-плагин CMS этого не умеет.** Плагины закрывают вход в аккаунт, а Contact Form 7,
  WPForms и веб-формы Битрикса к аккаунту не привязаны вовсе. «Личный кабинет» и «подтверждённая
  заявка» — два разных решения, а не две настройки одного.
</Warning>

Поэтому здесь не нужен ни плагин, ни готовый рецепт CMS: нужен небольшой серверный обработчик,
который вы кладёте рядом с формой.

## Почему обязателен серверный обработчик

Сделать это одним браузерным скриптом нельзя, и упирается это в три вещи сразу:

* поддерживается только Authorization Code Flow (плюс refresh) — implicit и hybrid отсутствуют;
* CORS не настроен ни на одном эндпоинте;
* access token — непрозрачный идентификатор, а интроспекция требует confidential-клиента с
  секретом, которого браузерный скрипт хранить не может.

Практическое следствие для SaaS-конструкторов (Tilda, Wix, Shopify): сценарий требует хостинга
под этот обработчик — самой страницы конструктора недостаточно.

## Схема

1. пользователь жмёт кнопку под формой;
2. переход на `/connect/authorize` с PKCE S256, `state` и `nonce` — плюс `acr_values`, если нужен
   конкретный канал;
3. возврат на `redirect_uri` — обычную страницу вашего сайта;
4. **сервер** меняет код на токены и проверяет `iss`, `aud`, `exp` и `nonce`;
5. рядом с заявкой записывается «подтверждено: `sub` + `channel_type`»;
6. кука аутентификации **не ставится** — входа не происходит.

## Про проверку подписи

Проверять подпись `id_token` JWT-библиотекой здесь **не обязательно**: OIDC Core §3.1.3.7,
правило 6 разрешает клиенту, получившему токен **прямым обращением к токен-эндпоинту**,
полагаться на проверку TLS вместо проверки подписи. Именно поэтому обработчику не нужны ни
JWT-библиотека, ни Composer.

<Warning>
  У послабления есть цена, и она не обсуждается: **проверку TLS-сертификата отключать нельзя ни
  при каких условиях** (`CURLOPT_SSL_VERIFYPEER` в PHP — всегда включён). Без неё исчезает ровно
  то, на чём держится разрешение не проверять подпись.
</Warning>

## Свои кнопки на своей странице

Две кнопки под формой — «Через Telegram» и «любым способом» — делаются параметром
authorize-запроса: `acr_values=channel:telegram` сужает выбор до одного канала, без параметра
пользователь выбирает сам.

<Note>
  Виджета или JS-SDK для этого не существует и не требуется: «своя кнопка» — это ссылка с нужными
  параметрами, а не встраиваемый компонент.
</Note>


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