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

73 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ✨ Пускать по доверенным заголовкам 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`, а
выкладку запускает человек.