## 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`. Этой работой они не проверяются, но требование к ним она обязана назвать.