Files
transcriber/docs/adr/ADR-2026-08-12-oidc-exchange-via-own-route.md
T
av 7f33c957e5 вход переехал на доверенный заголовок Authelia вместо собственного OIDC
- пришедшего называет заголовок Remote-User от прокси, и верят ему только с
  адреса из перечня trusted_proxies; своего входа у сервиса не осталось — ни
  корня /auth, ни кук, ни срока сессии, ни секрета клиента в конфиге и в базе
- учётная запись заводится первым обращением: EnsureUser в пакете хранилища,
  шаг схемы 202608220001 с колонкой provider_login и снятыми правилами users
- cmd/oidcstub заменён на cmd/devtools с подкомандой proxy; заодно закрыт
  унаследованный DL3066 — пользователь образа назван числом
2026-08-22 20:24:22 +03:00

4.5 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 соблюдено дословно, а не «по духу».
  • + наш код не знает ни одного поля ответа провайдера: обновление библиотеки под смену формата ответа доезжает само.
  • петля через собственный роутер: обработчик зовёт сервис, частью которого сам является. Это новый для проекта вид узла, и его придётся объяснять на каждом следующем изменении.
  • ответ разбирается текстом, типизированная ошибка теряется: причина отказа обмена доступна только кодом состояния.
  • роутер хранилища пришлось собирать один раз и держать полем: его сборка вешает обработчики на само приложение и без идентификатора, поэтому повторная не заменяет прежние. Ревью кода нашло это построенным путём — анонимный запрос копил обработчики без предела, а каждое сохранение задачи конвейером проходило по всем накопленным.