feat(tradein/caddy): снять basic_auth с /trade-in — своя авторизация (#2558) #2569
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2569
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/tradein-caddy-cutover"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Часть #2558 (эпик #2549, cutover). ⚠️ Не мержить раньше фикса навигации (
fix/tradein-team-nav-and-401) — иначе пользователь попадёт на форму входа, но раздел «Команда» из v2-навигации по-прежнему недостижим.Оба trade-in-блока (
handle /trade-in/api/*,@tradein) +@saleshare-редирект перенесены вышеimport caddy/users.caddy.snippet→ short-circuit до auth-гейта (тот же механизм, что уже у/health,/preview/*,@uipreview). Site Finder (/api/*,handle {}) остаётся под basic_auth без изменений.Ключевое по безопасности. После снятия гейта
{http.auth.user.id}пуст. Вместо того чтобы полагаться на неподтверждённое поведениеheader_up <field> <empty>(может не установить заголовок → клиентскийX-Authenticated-Userпрошёл бы насквозь, а backend вAUTH_MODE=dualвсё ещё принимает legacy trusted-header путь = внешняя подмена личности), применено документированное явное удалениеheader_up -X-Authenticated-Userв обоих блоках.X-Internal-Auth-Secretиз env (#2213) не тронут.@saleshareперенесён тоже: он ведёт на/trade-in/sale-share, который теперь публичен — оставить короткую ссылку строже целевой страницы было бы несогласованно.Валидация:
caddy validate --adapter caddyfileв официальном образеcaddy:2локально (со смонтированным snippet) →Valid configuration. Прод не трогался, reload сделает деплой.Последствия после мержа: тестовые учётки
admintest/pilottest/analysttest/expiredtestесть только в roles.yaml, вtradein_usersне мигрировались → потеряют доступ к Мере (боевые 13 имеют пароли, вход проверен). Follow-up на заметку: legacy dual-mode путь для trade-in становится мёртвым (всегда 401 без cookie) — можно рассмотретьAUTH_MODE=db_onlyотдельным issue.Post-deploy smoke:
/trade-inбез basic-auth → форма входа;/и/api/*Site Finder → по-прежнему 401 basic_auth.Оба trade-in блока (`handle /trade-in/api/*`, `@tradein`) + связанный `@saleshare` редирект перенесены ВЫШЕ `import caddy/users.caddy.snippet` в route{} — Caddy матчит handle-блоки сверху вниз, поэтому они теперь short-circuit'ят до basic_auth-гейта (тот же механизм, что уже применён к /health, /preview/*, @uipreview). Site Finder (/, /api/*, /analytics) остаётся под basic_auth без изменений. Trade-in уже имеет собственную авторизацию (форма входа + opaque session-cookie, #2552) поверх RBAC внутри tradein-backend — Caddy basic_auth для него стал избыточным легаси-слоем. Security: после переноса плейсхолдер {http.auth.user.id} для этих блоков никогда не резолвится (basic_auth больше не выполняется на пути к ним). Вместо `header_up X-Authenticated-User {http.auth.user.id}` (Set-операция с пустым значением — недокументированно надёжна как удаление заголовка) используется явное `header_up -X-Authenticated-User` (документированная delete-семантика `-<field>`). Это исключает проход клиентского X-Authenticated-User насквозь к tradein-backend, который в auth_mode="dual" всё ещё принимает legacy trusted-header путь — без явного удаления внешний запрос с подделанным заголовком мог бы выдать себя за другого пользователя. X-Internal-Auth-Secret не тронут (#2213, всегда перезаписывается из env). Провалидировано: `caddy validate --config Caddyfile --adapter caddyfile` (caddy:2 образ, локальный docker) → "Valid configuration".