a1e83a86bc
Симптом: после ~30 мин админ видит 403 на /admin/*, перелогин чинит. Цепочка событий: 1. access_token истекает 2. oidc-client-ts автоматический silent renew падает (refresh_token expired за 30 мин SSO Session Idle / iframe заблокирован) 3. auth.user становится undefined (oidc убирает после full expiry) 4. TokenSync setAccessToken(null) — accessToken в apiClient зануляется 5. Следующий запрос идёт БЕЗ Authorization header 6. Backend (ORDINIS_AUTH_REQUIRED=false) пропускает как anonymous → ScopeContext = PUBLIC → controller с requireInternal() кидает 403 401-handler не срабатывает на 403 → юзер залипает. Также мой предыдущий useEffect в TokenSync (MR !267) триггерит на auth.user?.expired === true, но если user удалён полностью — optional-chaining вернёт undefined и useEffect не сработает. Fix: расширил interceptor чтобы на (status === 403 && accessToken == null) тоже вызывать unauthorizedHandler. Этот handler — single source of truth, делает signinSilent → fallback signinRedirect. Не цепляет legitimate 403 (когда у юзера ЕСТЬ токен но scope недостаточно — например viewer пытается dropить INTERNAL dict). accessToken != null в таких случаях → ветка не сработает.
Ordinis Admin UI
React 19 + Vite 7 + TanStack Router + TanStack Query + Tailwind v4 + i18next.
Локально
cd ordinis-admin-ui
pnpm install
# .env.local: VITE_API_PROXY=http://localhost:8081 (port-forward read-api)
pnpm dev
Контракт API
GET /api/v1/dictionaries(read-api) — список справочниковGET /api/v1/{dictionaryName}/records(read-api) — записи с локализациейPOST /api/v1/dictionaries(writer) — создание справочника (TODO в UI)POST /api/v1/dictionaries/{name}/records(writer) — создание записи (TODO в UI)
Сборка / Docker
docker build -t repo.nstart.cloud/terravault/ordinis-admin-ui:dev .
docker run --rm -p 8088:80 repo.nstart.cloud/terravault/ordinis-admin-ui:dev
# → http://localhost:8088
В кластере nginx проксирует /api/v1/* в ordinis-read-api (GET) и
ordinis-app (POST/PUT/PATCH/DELETE).