- пришедшего называет заголовок Remote-User от прокси, и верят ему только с адреса из перечня trusted_proxies; своего входа у сервиса не осталось — ни корня /auth, ни кук, ни срока сессии, ни секрета клиента в конфиге и в базе - учётная запись заводится первым обращением: EnsureUser в пакете хранилища, шаг схемы 202608220001 с колонкой provider_login и снятыми правилами users - cmd/oidcstub заменён на cmd/devtools с подкомандой proxy; заодно закрыт унаследованный DL3066 — пользователь образа назван числом
4.5 KiB
Код провайдера меняется на сессию вызовом собственного адреса хранилища внутри процесса
- Дата: 2026-08-12
- Источник: ../../openspec/changes/archive/2026-08-12-oidc-login/design.md, раздел «Вход и возврат ведёт наш код, разбор ответа — хранилище»
- Статус: заменено на ADR-2026-08-22-login-by-trusted-header
Решение
Обработчик возврата от провайдера зовёт собственный адрес хранилища
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 соблюдено дословно, а не «по духу».+наш код не знает ни одного поля ответа провайдера: обновление библиотеки под смену формата ответа доезжает само.−петля через собственный роутер: обработчик зовёт сервис, частью которого сам является. Это новый для проекта вид узла, и его придётся объяснять на каждом следующем изменении.−ответ разбирается текстом, типизированная ошибка теряется: причина отказа обмена доступна только кодом состояния.−роутер хранилища пришлось собирать один раз и держать полем: его сборка вешает обработчики на само приложение и без идентификатора, поэтому повторная не заменяет прежние. Ревью кода нашло это построенным путём — анонимный запрос копил обработчики без предела, а каждое сохранение задачи конвейером проходило по всем накопленным.