# Пришедшего называет заголовок доверенного прокси, а не собственный вход OIDC

- **Дата:** 2026-08-22
- **Источник:** [../../openspec/changes/archive/2026-08-22-trusted-header-login/design.md](../../openspec/changes/archive/2026-08-22-trusted-header-login/design.md), разделы Р1 и Р3

## Решение

Сервис перестаёт вести вход сам. Кто пришёл, он узнаёт из заголовка
`Remote-User`, поставленного обратным прокси, который сходил к Authelia;
заголовку верят только с адреса из объявленного перечня, а адрес берётся у
самого соединения. Учётная запись заводится первым обращением с новым логином и
находится по нему же дальше.

Убраны целиком: корень `/auth` с тремя адресами, куки `transcriber_session` и
`transcriber_login`, сверка состояния и проверочный код PKCE, обмен кода
внутрипроцессным запросом к роутеру хранилища, слои предъявления куки и запрета
продления, приведение настроек провайдера к конфигу, секрет клиента и срок жизни
сессии.

## Почему

Цитата из источника, раздел Р3:

> Сервис не выдаёт браузеру ни куки, ни токена. Каждый запрос узнаётся заново, по
> заголовку, который прокси поставил, сходив к Authelia.
>
> Это и есть выгода задачи: отзыв доступа перестаёт ждать. Пока сервис выдавал
> значение, живущее семь суток, отозванный у провайдера человек работал до
> истечения этого значения, и другого канала отзыва не было.

Оттуда же, Р1 — почему доверие судится адресом соединения, а не пересылаемым
заголовком:

> **`X-Forwarded-For` и его родня.** Значение целиком задаёт тот, кто шлёт
> запрос. Барьер, который подделывается той же строкой, что и обходится, не
> барьер вовсе.

Отвергнут промежуточный вариант — заголовок как вход, сессия хранилища как
продолжение (Р3):

> Дешевле в работе (слой срабатывал бы раз в неделю, а не на каждом запросе), но
> возвращает ровно то, что задача убирает: значение, переживающее отзыв. Семь
> суток вернулись бы вместе с ним.

Контур к решению был готов заранее: обратный прокси уже отдавал `Remote-*` трём
соседним сервисам того же контура, а правила для этого сервиса там не было
вовсе — он не выложен.

## Последствия

- `+` Отзыв доступа действует со следующего запроса, а не через семь суток:
  Authelia судит каждое обращение.
- `+` Секрет клиента исчез из конфига и из базы. Изъятие из инварианта «Секрет не
  покидает конфиг» снято: чтение файла базы больше не равносильно чтению
  секрета.
- `+` Своего протокола входа у сервиса не осталось — вместе с ним исчезли пять
  накопившихся задач о его механике.
- `+` Панель закрывается доменом, а не правилом на литерал пути; обход подменой
  знака перестаёт существовать.
- `−` **Весь барьер держится на настройке прокси.** Прокси, добавляющий заголовок
  вместо замены, открывает сервис любому под любым именем. Половину беды сервис
  закрывает сам — запрос с двумя значениями заголовка не узнаёт никого, — вторую
  проверить отсюда нечем: правило живёт в `pet-project-server`.
- `−` **Логин у провайдера переиспользуем**, и новый его владелец получает архив
  прежнего. Неизменяемого признака заголовок не приносит; не допускать
  переиспользования — работа провайдера. Обратная сторона: переименование
  заводит новую запись, а прежняя остаётся с архивом, который нечем ни слить, ни
  убрать.
- `−` Поиск учётной записи идёт на каждом запросе к области приложения вместо
  раза в неделю. Уникальный индекс делает это одним обращением к базе; замера не
  требовалось — сервисом пользуются единицы человек.
- `−` Половина работы лежит вне репозитория: до того как правило прокси и правило
  Authelia на домен заведут, сервис не узнает никого.
