- шаг схемы закрывает поверхность, которую хранилище приносит открытой: собственную регистрацию, вход по паролю и одноразовый код — без этого закрытие приёма обходилось двумя запросами - продление сессии выключено, срок семь суток: иначе отзыв доступа у провайдера до сервиса не доходит никогда - файл записи отдаётся вошедшему по токену файла — пересмотр ADR-2026-08-12-file-link-open-but-not-logged
48 lines
3.8 KiB
Markdown
48 lines
3.8 KiB
Markdown
# Кого пускать в сервис, решает правило провайдера, а не сервис
|
||
|
||
- **Дата:** 2026-08-12
|
||
- **Источник:** [../../openspec/changes/archive/2026-08-12-oidc-login/design.md](../../openspec/changes/archive/2026-08-12-oidc-login/design.md),
|
||
раздел «Кого пускать, решает провайдер, а не сервис»
|
||
|
||
## Решение
|
||
|
||
Сервис пускает всякого, кого пропустил провайдер, и **своей проверки допуска не
|
||
делает**. Кто допущен, определяет правило Authelia на этого клиента — настройка
|
||
выкладки, лежащая вне репозитория.
|
||
|
||
## Почему
|
||
|
||
Authelia — общий провайдер контура, а не выделенный под этот сервис: учётная
|
||
запись в ней есть у всякого, кому её завели ради любого другого сервиса на том же
|
||
сервере. Ревью дизайна назвало следствие прямо: механизм, приглашающий «второго
|
||
человека», приглашает всех, кто уже есть у провайдера.
|
||
|
||
Очевидный ответ — проверять принадлежность к названной в конфиге группе своим
|
||
кодом. Владелец от него отказался: это завело бы **второе место**, где решается
|
||
допуск, и решать его пришлось бы в двух местах согласованно.
|
||
|
||
Цена отказа названа в источнике и повторена в модели угроз:
|
||
|
||
> Правило живёт вне репозитория, в настройках выкладки, и сервис на него
|
||
> полагается так же, как полагается на обратный прокси в части панели
|
||
> администратора. Настроенный слишком широко клиент открывает сервис всем, у кого
|
||
> есть учётная запись в общей Authelia, — и проверить это по коду нельзя.
|
||
|
||
Запись заводится как **намеренный отказ от очевидного подхода**: проверку группы
|
||
предложат снова, и без записанной причины она выглядит бесплатной.
|
||
|
||
## Последствия
|
||
|
||
- `+` допуск решается в одном месте, а не в двух; изменение круга допущенных не
|
||
требует ни правки кода, ни выкладки.
|
||
- `+` сервис не читает из ответа провайдера ничего сверх нужного для заведения
|
||
записи — ни групп, ни ролей.
|
||
- `−` защита сервиса стала свойством настройки, лежащей в другом репозитории, и
|
||
ревью её проверить не может: ни один проход не увидит, что клиент настроен
|
||
слишком широко.
|
||
- `−` ошибка в настройке клиента не имеет наблюдаемого признака внутри сервиса:
|
||
посторонний, которого пропустила Authelia, выглядит как законный пользователь.
|
||
- `−` разграничения по владельцу нет, поэтому цена ошибки в настройке — все
|
||
записи и все расшифровки разом, а не одна учётная запись. Сузит это
|
||
`record-ownership`.
|