## Why

HTTP API открыт наружу без всякой проверки: кто угодно из интернета заводит
задачи расшифровки за наши деньги и читает чужие расшифровки, подобрав
идентификатор задачи. Сегодняшний периметр так и записан в модели угроз —
аутентификации не делает ни обратный прокси, ни само приложение.

Второго человека пригласить в сервис сейчас нельзя: это значит открыть ему всё,
что в сервисе уже лежит.

## What Changes

- Сервис узнаёт, кто к нему пришёл. Учётные записи заводит и проверяет внешний
  провайдер — Authelia по OIDC; своей регистрации и своих паролей не заводим.
- **BREAKING** Приём записи и опрос готовности задачи требуют входа: запрос без
  сессии получает отказ и не заводит задачу, а текста расшифровки не отдаёт.
  Внешняя программа, ходившая в API без всякого входа, перестаёт работать.
- Появляются вход и выход: вход уводит человека к провайдеру и возвращает
  обратно уже узнанным, выход закрывает доступ немедленно.
- Проба здоровья и метрики остаются открытыми и сессии не требуют: ни у пробы,
  ни у сборщика метрик её нет. Наружу их закрывает правило обратного прокси —
  это работа выкладки.
- Разграничения записей по владельцу здесь **нет**: после входа человек видит
  ровно столько же, сколько видно сейчас.

## Capabilities

### New Capabilities
- `access`: кто пришёл в сервис и пускают ли его дальше — вход через внешнего
  провайдера, чем предъявляется сессия, что её прекращает и какие адреса
  остаются открытыми.

### Modified Capabilities
- `intake`: приём записи и опрос готовности задачи перестают быть доступны
  анонимно — оба требуют узнанного отправителя.
- `storage`: ссылка на файл записи перестаёт быть правом пройти по ней — файл
  отдаётся только узнанному отправителю.

## Impact

- Коллекция пользователей хранилища: включённый провайдер `oidc` с адресами
  Authelia, идентификатором клиента и секретом; связь учётной записи с внешним
  провайдером хранилище ведёт своей служебной коллекцией.
- `POST /api/audio` и `GET /api/status/{id}` — публичный контракт HTTP API
  объявлен проектом необратимым, и здесь он меняется: у обоих появляется отказ
  без входа.
- Новые адреса входа, возврата от провайдера и выхода.
- Секция конфигурации под провайдера: адрес, идентификатор клиента, секрет.
  Секрет попадает в настройки коллекции хранилища — это новое место, где он
  живёт, и его надо назвать в модели угроз.
- `config.dist.toml` и разбор конфига.
- `docs/security.md`: первая строка периметра перестаёт быть верной.
- Панель администратора не трогается: в неё провайдер не пускает, и закрывает её
  обратный прокси.
