Files
transcriber/tasks/items/trusted-header-login.md
T
av e4441f3c49 tasks: вход переезжает на заголовки прокси, пять задач про OIDC закрыты
- заведена `trusted-header-login` и поставлена в голову очереди
- пять задач про механику OIDC закрыты как отменённые ею
- `dev-run-task` и `api-tokens` переписаны под новый вход
2026-08-22 17:43:18 +03:00

6.6 KiB

Пускать по доверенным заголовкам 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, а выкладку запускает человек.