# ✨ Пускать по доверенным заголовкам Authelia вместо входа OIDC - **Тип:** feature - **Категория:** Очередь — Вход переезжает на заголовки прокси: пять задач про механику OIDC этим закрываются, а всё, что трогает вход и локальный прогон, ставится на него - **Зачем:** Вход собран своими руками — состояние, PKCE, обмен кода внутрипроцессным запросом к роутеру хранилища, — а обратный прокси уже отдаёт трём соседним сервисам заголовки Remote-* от Authelia; заодно секрет клиента лежит в базе, а панель обходится подменой знака в пути. Кто пришёл, сервис узнаёт из заголовка, который поставил обратный прокси, сходив к Authelia. Своего входа у сервиса не остаётся вовсе: ни адреса, уводящего к провайдеру, ни возврата, ни куки сессии, ни выхода. Контур к этому готов: `files/caddyproxy/Caddyfile.template` в `pet-project-server` уже отдаёт `Remote-User`, `Remote-Groups`, `Remote-Email` и `Remote-Name` панели, netdata и remembos, а правила для этого сервиса там нет вовсе — он не выложен. Контейнер портов наружу не публикует. Три следствия, ради которых это и делается. Отзыв доступа перестаёт ждать семи суток: Authelia судит каждый запрос, а не только вход. Секрет клиента уходит из конфига и из базы — вместе с ним снимается изъятие из инварианта «Секрет не покидает конфиг». Панель закрывается доменом, а не правилом на литерал пути, и обход `/%5f/` перестаёт существовать. ## Затрагивает - адреса `GET /auth/login`, `GET /auth/callback`, `POST /auth/logout` — исчезают целиком вместе с корнем `/auth`; - куки `transcriber_session` и `transcriber_login`, слои `SessionFromCookie` и `BlockSessionRefresh`; - заголовки `Remote-User`, `Remote-Email`, `Remote-Name` — новый недоверенный вход, и адрес источника запроса как условие доверия к ним; - секция `[auth]` конфига и `config.example.toml`: имена ключей — необратимое; - настройки провайдера у коллекции `users` (`ApplyProviderSettings`) и новый шаг схемы; применённый `202608120001_oidc_login` не переписывается; - собственные адреса входа хранилища под `/api/collections/users/`: обмена кода, входа по паролю и запроса подтверждения почты больше не предъявляет никто; - `cmd/oidcstub` и подставной провайдер в тестах входа; - способ представиться на машине без прокси: сегодня им служит заглушка провайдера, и замену ей называет эта задача — на неё опирается `dev-run-task`; - спека `access`; `docs/security.md` — периметр, недоверенный вход, «Четвёртый сдвиг»; `CLAUDE.md` — изъятие из инварианта о секрете; `docs/architecture.md`; - правило прокси и правило Authelia для домена сервиса — они живут в `pet-project-server`, вне этого репозитория. ## Критерии приёмки - Обращение к адресу приложения с заголовком от доверенного источника идёт от имени учётной записи, заведённой при первом таком обращении, а повторное с тем же значением попадает в ту же запись. Оракул — тест обработчика: два запроса подряд, в хранилище одна запись пользователя. - Тот же заголовок с недоверенного адреса даёт `401`, а не вход под названным именем. Оракул — тест: запрос с адресом источника вне перечня доверенных. - Собственные адреса входа хранилища сессии не выдают и учётную запись не меняют. Оракул — тест по перечню адресов под `/api/collections/users/`: каждый отвечает отказом. - Механики OIDC в дереве не осталось: корня `/auth`, кук входа, `ApplyProviderSettings`, `cmd/oidcstub` и секрета клиента в конфиге. Оракул — поиск по этим именам плюс зелёный `task gate`. - Разграничение записей по владельцу работает как прежде: чужая запись неотличима от несуществующей. Оракул — существующие тесты владельца остаются зелёными. ## Рамки Ключ учётной записи — `Remote-User`: переименование пользователя в Authelia заведёт новую запись, и прежние записи останутся у прежней. Это принятая цена, и она записывается в спеку, а не обходится. Второй уровень доступа по `Remote-Groups` здесь не заводится: его потребителя — страницы расхода — ещё нет. Половина работы живёт в `pet-project-server` и этим репозиторием не проверяется ничем: задача обязана назвать требование к контуру в `docs/security.md`, а выкладку запускает человек.