вход переехал на доверенный заголовок Authelia вместо собственного OIDC

- пришедшего называет заголовок Remote-User от прокси, и верят ему только с
  адреса из перечня trusted_proxies; своего входа у сервиса не осталось — ни
  корня /auth, ни кук, ни срока сессии, ни секрета клиента в конфиге и в базе
- учётная запись заводится первым обращением: EnsureUser в пакете хранилища,
  шаг схемы 202608220001 с колонкой provider_login и снятыми правилами users
- cmd/oidcstub заменён на cmd/devtools с подкомандой proxy; заодно закрыт
  унаследованный DL3066 — пользователь образа назван числом
This commit is contained in:
av
2026-08-22 20:24:22 +03:00
parent e4441f3c49
commit 7f33c957e5
63 changed files with 5257 additions and 2305 deletions
@@ -0,0 +1,71 @@
## 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`. Этой работой они не проверяются, но
требование к ним она обязана назвать.