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 в таких случаях → ветка не сработает.