- шаг схемы закрывает поверхность, которую хранилище приносит открытой: собственную регистрацию, вход по паролю и одноразовый код — без этого закрытие приёма обходилось двумя запросами - продление сессии выключено, срок семь суток: иначе отзыв доступа у провайдера до сервиса не доходит никогда - файл записи отдаётся вошедшему по токену файла — пересмотр ADR-2026-08-12-file-link-open-but-not-logged
52 lines
4.3 KiB
Markdown
52 lines
4.3 KiB
Markdown
# Код провайдера меняется на сессию вызовом собственного адреса хранилища внутри процесса
|
||
|
||
- **Дата:** 2026-08-12
|
||
- **Источник:** [../../openspec/changes/archive/2026-08-12-oidc-login/design.md](../../openspec/changes/archive/2026-08-12-oidc-login/design.md),
|
||
раздел «Вход и возврат ведёт наш код, разбор ответа — хранилище»
|
||
|
||
## Решение
|
||
|
||
Обработчик возврата от провайдера зовёт **собственный адрес хранилища**
|
||
`auth-with-oauth2` внутри процесса, через его же роутер, а не по сети и не
|
||
разбирая ответ провайдера своими руками.
|
||
|
||
## Почему
|
||
|
||
Решение [ADR-2026-08-11-pocketbase-storage-with-admin-panel](ADR-2026-08-11-pocketbase-storage-with-admin-panel.md)
|
||
отдало разбор ответа провайдера хранилищу: только тогда учётные записи заводятся
|
||
сами и видны в панели. Это решение не пересматривается — пересматривается способ
|
||
до него дотянуться.
|
||
|
||
Проверка исходников библиотеки версии 0.39.10 показала, что обмен наружу не
|
||
экспортирован: он живёт неэкспортированной функцией за собственным маршрутом.
|
||
Остались три формы, и владелец выбрал первую:
|
||
|
||
> (а) внутрипроцессный вызов собственного маршрута `auth-with-oauth2`: решение
|
||
> 2026-08-11 соблюдено дословно, цена — петля «наш обработчик → наш роутер → наш
|
||
> обработчик», разбор JSON-ответа и потеря типизированной ошибки; (б) сборка
|
||
> обмена из экспортированных кусков с сохранением записи и связи через `app.Save`:
|
||
> прямой код без петли, цена — пересмотр решения 2026-08-11 отдельным ADR; (в)
|
||
> отложить вход до появления фронтенда.
|
||
|
||
Запись заводится как **намеренный отказ от очевидного подхода**: собрать обмен
|
||
своими руками выглядит проще и дешевле, и предложение вернётся, если причина не
|
||
записана.
|
||
|
||
## Последствия
|
||
|
||
- `+` разбор ответа провайдера, заведение учётной записи и связь её с внешним
|
||
провайдером остаются за хранилищем — решение 2026-08-11 соблюдено дословно, а
|
||
не «по духу».
|
||
- `+` наш код не знает ни одного поля ответа провайдера: обновление библиотеки
|
||
под смену формата ответа доезжает само.
|
||
- `−` петля через собственный роутер: обработчик зовёт сервис, частью которого
|
||
сам является. Это новый для проекта вид узла, и его придётся объяснять на
|
||
каждом следующем изменении.
|
||
- `−` ответ разбирается текстом, типизированная ошибка теряется: причина отказа
|
||
обмена доступна только кодом состояния.
|
||
- `−` роутер хранилища пришлось собирать **один раз** и держать полем: его
|
||
сборка вешает обработчики на само приложение и без идентификатора, поэтому
|
||
повторная не заменяет прежние. Ревью кода нашло это построенным путём —
|
||
анонимный запрос копил обработчики без предела, а каждое сохранение задачи
|
||
конвейером проходило по всем накопленным.
|