## 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`: первая строка периметра перестаёт быть верной. - Панель администратора не трогается: в неё провайдер не пускает, и закрывает её обратный прокси.