refactor(security): убрать UI ввода admin token (backend не требует с PR #437) #442
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#442
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "refactor/remove-admin-token-ui"
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?
⚠️ Critical bug fix + dead UI cleanup
После PR #437 backend больше не требует
X-Admin-Tokenheader. Frontend всё ещё имел input fields и логику для ввода token — это блокировало доступ для новых users.Critical bug
useQuery({ enabled: !!token, ... })блокирует queries когдаtokenпустой → новые users (kopylov,user1..10с чистым browser) видят «Загрузка…» навсегда на admin pages.Только у меня (admin) работало потому что в localStorage остался старый token из дней X-Admin-Token. Кейс воспроизводится в incognito или у любого нового стейкхолдера.
Что сделано
9 файлов изменены, +69 / -483 LOC:
src/app/admin/scrape/page.tsxsrc/app/admin/scrape/all/page.tsxsrc/app/admin/scrape/cadastre/page.tsxsrc/app/admin/scrape/geo/page.tsxsrc/app/admin/scrape/objective/page.tsxsrc/app/admin/leads/page.tsxsrc/components/admin/BulkGeoPanel.tsxsrc/components/admin/JobSettingsPanel.tsxsrc/components/admin/ScrapeLogsPanel.tsxВ каждом файле:
tokenstate +localStorage.getItem/setItem("admin_token")headers: { "X-Admin-Token": token }из всехapiFetchcallsenabled: !!tokenиз всехuseQuery(всегда enabled)tokenизqueryKeyмассивов<input type="password">для token!tokenconditional guards («Введите Admin Token...»)token: stringprop удалён из 3 компонентов (backward-compatible — caller уже не передаёт)НЕ менялось
backend/app/core/deps.py—verify_admin_tokenостаётся (rollback safety, как и в PR #437)frontend/src/lib/api.ts—apiFetchimpl остаётсяVerify after merge
kopylov:wGLG9RS1uEIBjYCLв private browser (без localStorage)/admin/scrape→ data должна загружаться без ввода token/admin/leads→ таблица загружается сразуRelated
- Удалить token state + localStorage.setItem("admin_token") из всех admin pages - Удалить X-Admin-Token header из всех apiFetch вызовов - Убрать enabled: !!token из useQuery — fix «Загрузка…» forever для новых users - Убрать token prop из BulkGeoPanel, JobSettingsPanel, ScrapeLogsPanel - Удалить !token guards и UI input fields для ввода токена - queryKey: убрать token из ключей (scrape-runs, scrape-queue, etc.)Merged via deep-code-reviewer — verdict APPROVE.
Deep review summary
Files reviewed: 9 (P1: 6 admin pages, P2: 3 reusable panels)
Lines: +69 / -483 (massive net delete = good signal)
Time: ~8 min
Complete removal verification (CRITICAL focus #1)
Grep на PR-branch tree (worktree из
df34ad7):X-Admin-Tokenв admin pages/panelsadmin_tokenlocalStorageapp/legacy/site-finder/page.tsx:135— legacy path, out of scopeenabled: !!tokenSCRAPE_ADMIN_TOKENplaceholder<input type="password">для tokenOut-of-scope stale refs (acceptable, follow-up):
frontend/src/lib/api/weightProfiles.ts:94-95— отдельный admin scope (site-finder weight profiles), не покрыт PR #437. Backendadmin_weight_profiles.pyупомянут в decision как тоже cleaned → frontend hook сюда не задели. Follow-up PR нужен.frontend/src/lib/api-types.ts— 27×"X-Admin-Token"?: string | null(codegen из OpenAPI). Поскольку backendverify_admin_tokenоставлен для rollback safety, OpenAPI schema продолжает эмитить header param. Чистится регенерацией после полного backend removal.Findings detail
enabledсохранены корректно:cadastre/page.tsx:160—enabled: expandedId !== null(row expand gate) ✅scrape/page.tsx:208—enabled: showFailures(lazy load failures) ✅JobSettingsPanels.enabled/draft.enabled— это domain field (cron enabled), не auth gate ✅<JobSettingsPanel />,<BulkGeoPanel />,<ScrapeLogsPanel ...>все updated, не передаютtoken. TS strict — signature breaking, build fail если caller остался.inputStyleудалён изscrape/all/page.tsx(orphan), остальные файлы продолжают использовать.Linkвleads/page.tsx— used (line 517 в jobs table). Все imports чистые.a2147872, отстал на 1 commit (PR #441tradein-mvp/backend/app/services/scrapers/{avito,base}.py). Zero file overlap с frontend → conflict-free squash..forgejo/workflows/deploy.ymlfrontend/**filter сработает, frontend image rebuild → push к Beget VPS.<form>orphan check — нет orphaned form wrappers (cadastre create job form и BulkGeoPanel form остались с real bodies).admin_tokenостаётся в localStorage admin users. Backend ignores, не security risk. АктивныйremoveItem— nice-to-have (можно в onMount addEventListener), не блок.Follow-up tasks (post-merge, non-blocking)
decisions/Decision_Remove_AppLevel_AdminAuth_May23.md— добавить раздел "Frontend cleanup completed PR #442", убрать "frontend: продолжает слать X-Admin-Token" из "Что НЕ менялось"weightProfiles.tshooks убратьadminTokenparameter (site-finder weight profiles backend тоже без auth per decision)npm run codegen) после full backend removalverify_admin_tokenlocalStorage.removeItem("admin_token")для cleaner stateSelf-acknowledged missed pattern (4-й подряд)
В review PR #437 я указал "Frontend cleanup next sprint" как acceptable trade-off — НЕ identified что
enabled: !!tokenблокирует UI для new users без token. Этот паттерн идёт в vault как universal review rule:Risk / reversibility
a2953e97)