- пришедшего называет заголовок Remote-User от прокси, и верят ему только с адреса из перечня trusted_proxies; своего входа у сервиса не осталось — ни корня /auth, ни кук, ни срока сессии, ни секрета клиента в конфиге и в базе - учётная запись заводится первым обращением: EnsureUser в пакете хранилища, шаг схемы 202608220001 с колонкой provider_login и снятыми правилами users - cmd/oidcstub заменён на cmd/devtools с подкомандой proxy; заодно закрыт унаследованный DL3066 — пользователь образа назван числом
57 lines
4.7 KiB
Markdown
57 lines
4.7 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),
|
||
раздел «Что изменило ревью кода», плюс отчёт триажа
|
||
[../../openspec/changes/archive/2026-08-12-oidc-login/review/report.md](../../openspec/changes/archive/2026-08-12-oidc-login/review/report.md),
|
||
пункт 6
|
||
- **Статус:** заменено на [ADR-2026-08-22-login-by-trusted-header](ADR-2026-08-22-login-by-trusted-header.md)
|
||
|
||
## Решение
|
||
|
||
Срок жизни сессии — **семь суток**, назначается при каждом подъёме сервиса.
|
||
Продление сессии **выключено**: адрес, которым хранилище меняет предъявленное
|
||
значение на новое, закрыт слоем приложения.
|
||
|
||
## Почему
|
||
|
||
Умолчание хранилища — пять суток и продлеваемая сессия. Второе делает первое
|
||
бессмысленным, и это выяснило ревью кода замером: предъявитель одного живого
|
||
значения продлевает себе доступ бессрочно, никуда не входя.
|
||
|
||
Значение имеет то, на чём держится вся остановка перерасхода. Паспорт опирается
|
||
на **отзыв доступа в Authelia** как на способ остановить того, кто тратит слишком
|
||
много. Но сервис после входа к провайдеру не обращается: подпись сессии считается
|
||
от значений в базе, и отзыв у провайдера до сервиса доходит **только** истечением
|
||
срока. При живом продлении не доходит никогда — человек, которому закрыли доступ,
|
||
сохраняет его навсегда.
|
||
|
||
Отвергнуто и названо ценой:
|
||
|
||
> сверяться с провайдером по расписанию — новая связь с Authelia и обработка её
|
||
> недоступности, работа шире задачи; принять как есть — тогда паспорт теряет
|
||
> способ остановить того, кто тратит слишком много.
|
||
|
||
Число семь суток выбрано владельцем как компромисс: реже входить против дольше
|
||
ждать, пока отзыв доедет.
|
||
|
||
Срок назначается **при подъёме, а не шагом схемы**, и это отдельное решение с
|
||
причиной: применённый шаг не переписывается, поэтому число, положенное туда,
|
||
разошлось бы со сроком жизни куки при первой же правке — браузер получил бы
|
||
новый срок, а хранилище продолжило выдавать прежний.
|
||
|
||
## Последствия
|
||
|
||
- `+` отзыв доступа у провайдера доходит до сервиса гарантированно, максимум за
|
||
семь суток; без этого он не доходил вовсе.
|
||
- `+` срок жизни сессии стал числом, которое кто-то выбрал, и правится он в одном
|
||
месте вместе со сроком куки.
|
||
- `−` человек перевходит раз в неделю, и это заметно: своей страницы у сервиса
|
||
нет, так что вход начинается с перехода по адресу входа руками.
|
||
- `−` семь суток — всё ещё окно, в которое отозванный доступ работает. Немедленно
|
||
закрыть чужую сессию можно только руками в панели, обновив ключ токенов записи;
|
||
своего адреса у этого нет.
|
||
- `−` закрытие продления сделано слоем приложения, а не настройкой коллекции:
|
||
библиотека выдаёт сессию продлеваемой всегда, и отключить это в ней нечем.
|
||
Слой придётся помнить при всякой правке маршрутов.
|