## Why

Сервис ведёт вход своими руками: уводит человека к провайдеру, помнит выданное
состояние у браузера, меняет принесённый код на сессию и потом семь суток верит
выданной куке, ни разу больше не спросив провайдера. Отзыв доступа доходит до
сервиса только истечением этой куки — то есть с задержкой до недели, — а секрет
клиента ради обмена лежит и в конфиге, и в базе.

Обратный прокси между интернетом и сервисом уже спрашивает Authelia на **каждом**
запросе и называет пришедшего заголовком: трём соседним сервисам того же контура
он так и служит. Сервису достаточно этот заголовок прочитать, и весь собственный
протокол входа становится лишним.

## What Changes

- **BREAKING** Кто пришёл, сервис узнаёт из заголовка, поставленного обратным
  прокси. Своего входа у него не остаётся вовсе: ни адреса, уводящего к
  провайдеру, ни возврата, ни куки, ни выхода.
- **BREAKING** Заголовку верят только с адреса, объявленного доверенным.
  Пришедший с любого другого адреса тем же заголовком не узнаётся никак.
- Учётная запись заводится сама, при первом обращении с новым именем, и
  находится по нему же при каждом следующем. Имя из заголовка становится ключом
  учётной записи и живёт своей колонкой.
- **BREAKING** Секция настроек входа переписывается целиком: адреса провайдера,
  идентификатор и секрет клиента уходят, приходит перечень доверенных адресов.
- Секрет клиента исчезает и из настроек хранилища. Вместе с ним снимается изъятие
  из инварианта «Секрет не покидает конфиг»: чтение файла базы больше не
  равносильно чтению секрета.
- Отзыв доступа перестаёт ждать семи суток: Authelia судит каждый запрос, а
  сервис назначенного срока сессии больше не держит вовсе.
- Панель владельца закрывается доменом, а не правилом на литерал пути, и обход
  подменой знака в адресе перестаёт существовать. Половина этой работы живёт в
  контуре выкладки, вне репозитория.
- Способ представиться на машине без прокси заводится заново: подставной
  провайдер уходит вместе с протоколом.

## Capabilities

### New Capabilities

Новых нет: работа меняет то, как узнаётся пришедший, а не заводит новое
поведение.

### Modified Capabilities

- `access`: узнавание пришедшего переезжает с собственного входа у внешнего
  провайдера на заголовок доверенного источника. Уходят требования о протоколе
  входа, о куке сессии, о сроке её жизни, о выходе, о продлении и о секрете
  провайдера в конфиге; приходят требования о доверенном источнике, о заголовке
  как имени пришедшего и о заведении учётной записи первым обращением.
  Требования о владельце записи, об открытых адресах и о том, как приложение
  узнаёт вошедшего, остаются по существу и правятся в формулировках.

## Impact

- Транспорт HTTP: обработчики входа и возврата, слой предъявления куки, слой
  запрета продления, корень `/auth` целиком.
- Хранилище: приведение настроек провайдера к конфигу при подъёме, новый шаг
  схемы — колонка имени из заголовка, снятие настроек OAuth2 и правила создания
  записи. Применённый шаг `202608120001_oidc_login` не переписывается.
- Настройки: секция входа в конфиге и в его образце. Имена ключей — необратимое,
  и решение по ним принимает человек.
- Приложение: адрес, которым экран уводил ко входу.
- Инструменты: подставной провайдер OIDC уходит, на его место встаёт способ
  представиться без прокси. На него опирается задача `dev-run-task`.
- Документы: модель угроз — периметр, недоверенный вход, разграничение доступа,
  сдвиг про секрет в базе; `CLAUDE.md` — изъятие из инварианта о секрете;
  устройство и схема хранилища.
- Вне репозитория: правило обратного прокси и правило Authelia для домена
  сервиса живут в `pet-project-server`. Этой работой они не проверяются, но
  требование к ним она обязана назвать.
