Files
transcriber/tasks/items/oidc-login.md
T
av 6c996209b7 docs: применены находки вычитки по разведке PocketBase
- сняты повтор слова в записке разведки и та же строка в цитате ADR,
  убран термин «чекпоинт», разведена цепочка местоимений в паспорте
- oidc-login: «зачем» перестало повторять тело, задача заявила пункт 3
  «Завершения» цели multi-user — он не был закрыт ни одной её задачей
2026-08-11 13:17:28 +03:00

64 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ✨ Пускать в приложение только после входа через OIDC
- **Тип:** feature
- **Категория:** Очередь
- **Зачем:** HTTP API открыт наружу без аутентификации: любой из интернета заводит задачи за наши деньги и читает чужие расшифровки по идентификатору.
- **Теги:** goal:multi-user, question
Двигает пункты 1 и 3 «Завершения» цели: неаутентифицированный запрос к записям
не проходит ни к странице, ни к API; вход идёт через OIDC у Authelia, а выход из
сессии работает.
Провайдер — Authelia по OIDC. Своей регистрации и своих паролей не делаем, это
граница из [паспорта](../../docs/passport.md). Разграничения записей по владельцу
здесь ещё нет: после входа видно всё, что видно сейчас, — этим занимается
`record-ownership`.
**Ответ провайдера разбирает PocketBase, а не наш код** — решено 2026-08-11
([adr](../../docs/adr/ADR-2026-08-11-pocketbase-storage-with-admin-panel.md)).
У её коллекции пользователей настраивается провайдер `oidc` с адресами Authelia,
и учётные записи заводятся сами; проверено на версии 0.39.10,
[docs/research/pocketbase.md](../../docs/research/pocketbase.md). Отсюда порядок:
задача идёт после `pocketbase-storage`, до неё настраивать нечего.
## Затрагивает
- настройка провайдера `oidc` у коллекции пользователей PocketBase: адреса
Authelia, идентификатор клиента, секрет, соответствие полей учётной записи;
- эндпоинты входа и выхода, которые PocketBase приносит своими;
- `POST /api/audio` и `GET /api/status/:id` — оба уходят за аутентификацию;
- `GET /health` и `GET /metrics` — решить и записать, остаются ли открытыми;
- хранение сессии: её ведёт PocketBase, и решить надо, чем она предъявляется
приложению;
- секция конфигурации под провайдера: адрес, идентификатор клиента, секрет;
- `docs/security.md` — периметр меняется, и первая его строка перестаёт быть
верной;
- `config.dist.toml` и `internal/config`.
## Критерии приёмки
- Запрос к `POST /api/audio` и `GET /api/status/:id` без сессии получает отказ, а
не заводит задачу и не отдаёт текст. Оракул — тест на обоих эндпоинтах без
куки: код ответа 401 либо 302 на вход, тело без данных задачи.
- Сессия переживает перезапуск приложения. Оракул — тест: запрос с прежней кукой
после пересоздания сервера проходит.
- Выход из сессии закрывает доступ. Оракул — тест: после выхода тот же запрос
получает отказ.
- Секрет провайдера не попадает ни в лог, ни в ответ. Оракул — тест на отсутствие
значения секрета в записанном выводе логгера.
- Первая строка `docs/security.md` описывает новый периметр. Оракул — `task
gate`, шаг `docs.py check`.
## Рамки
Владельца у записи здесь не заводим и выборку не сужаем: после входа видно
столько же, сколько сейчас. Инвариант «бот отвечает только тем, кто в белом
списке» не трогаем — он живёт до `telegram-account-link`. Панель администратора
тоже не трогаем: наружу её закрывает Authelia на обратном прокси, а это работа
выкладки.
## Вопросы
Остаются ли `GET /health` и `GET /metrics` открытыми? Прокси и система сбора
метрик сессии не имеют, но и наружу их отдавать незачем.