Files
transcriber/docs/adr/ADR-2026-08-12-oidc-exchange-via-own-route.md
T
av c44f0e7582 HTTP API закрыт за вход через OIDC у Authelia
- шаг схемы закрывает поверхность, которую хранилище приносит открытой:
  собственную регистрацию, вход по паролю и одноразовый код — без этого
  закрытие приёма обходилось двумя запросами
- продление сессии выключено, срок семь суток: иначе отзыв доступа у
  провайдера до сервиса не доходит никогда
- файл записи отдаётся вошедшему по токену файла — пересмотр
  ADR-2026-08-12-file-link-open-but-not-logged
2026-08-12 17:44:22 +03:00

4.3 KiB
Raw Blame History

Код провайдера меняется на сессию вызовом собственного адреса хранилища внутри процесса

Решение

Обработчик возврата от провайдера зовёт собственный адрес хранилища auth-with-oauth2 внутри процесса, через его же роутер, а не по сети и не разбирая ответ провайдера своими руками.

Почему

Решение ADR-2026-08-11-pocketbase-storage-with-admin-panel отдало разбор ответа провайдера хранилищу: только тогда учётные записи заводятся сами и видны в панели. Это решение не пересматривается — пересматривается способ до него дотянуться.

Проверка исходников библиотеки версии 0.39.10 показала, что обмен наружу не экспортирован: он живёт неэкспортированной функцией за собственным маршрутом. Остались три формы, и владелец выбрал первую:

(а) внутрипроцессный вызов собственного маршрута auth-with-oauth2: решение 2026-08-11 соблюдено дословно, цена — петля «наш обработчик → наш роутер → наш обработчик», разбор JSON-ответа и потеря типизированной ошибки; (б) сборка обмена из экспортированных кусков с сохранением записи и связи через app.Save: прямой код без петли, цена — пересмотр решения 2026-08-11 отдельным ADR; (в) отложить вход до появления фронтенда.

Запись заводится как намеренный отказ от очевидного подхода: собрать обмен своими руками выглядит проще и дешевле, и предложение вернётся, если причина не записана.

Последствия

  • + разбор ответа провайдера, заведение учётной записи и связь её с внешним провайдером остаются за хранилищем — решение 2026-08-11 соблюдено дословно, а не «по духу».
  • + наш код не знает ни одного поля ответа провайдера: обновление библиотеки под смену формата ответа доезжает само.
  • петля через собственный роутер: обработчик зовёт сервис, частью которого сам является. Это новый для проекта вид узла, и его придётся объяснять на каждом следующем изменении.
  • ответ разбирается текстом, типизированная ошибка теряется: причина отказа обмена доступна только кодом состояния.
  • роутер хранилища пришлось собирать один раз и держать полем: его сборка вешает обработчики на само приложение и без идентификатора, поэтому повторная не заменяет прежние. Ревью кода нашло это построенным путём — анонимный запрос копил обработчики без предела, а каждое сохранение задачи конвейером проходило по всем накопленным.