diff --git a/scripts/bootstrap_nodedc_platform_plan.py b/scripts/bootstrap_nodedc_platform_plan.py index 6e795fc..6496eeb 100644 --- a/scripts/bootstrap_nodedc_platform_plan.py +++ b/scripts/bootstrap_nodedc_platform_plan.py @@ -276,7 +276,7 @@ Runtime bootstrap выполнен: curl страницы auth.local.nodedc по Дополнение 2026-05-04: экран "You've logged out of NODE.DC Launcher" признан Authentik provider invalidation dashboard. OAuth2 providers переключены на штатный default-invalidation-flow с UserLogoutStage, чтобы global logout закрывал Authentik session и возвращал пользователя в NODE.DC route без показа Authentik application logout UI. -Дополнение 2026-05-04: обнаружен второй logout gap — Authentik end-session может завершаться белой страницей "Logout successful" вместо возврата в продуктовый маршрут. Launcher logout handoff изменен: end-session вызывается только как best-effort hidden identity logout, а финальный пользовательский redirect всегда идет в http://launcher.local.nodedc/auth/login?prompt=login. Launcher frontend использует window.location.replace для logout и revalidates session on bfcache pageshow, чтобы browser Back не показывал старый залогиненный state после выхода. +Дополнение 2026-05-04: обнаружен второй logout gap — Authentik end-session может завершаться белой страницей "Logout successful" вместо возврата в продуктовый маршрут, а hidden fetch end-session не гарантирует закрытие SSO-cookie. Launcher logout handoff переведен на top-level IdP logout: после front-channel закрытия приложений браузер уходит в Authentik end-session с зарегистрированным post_logout_redirect_uri=http://launcher.local.nodedc/auth/logged-out, затем /auth/logged-out чистит platform cookies и переводит в /auth/login?prompt=login. Launcher frontend использует window.location.replace для logout и revalidates session on bfcache pageshow, чтобы browser Back не показывал старый залогиненный state после выхода. Дополнение 2026-05-04: authentication flow приближен к старому Plane login в рамках Authentik-native customization. Brand attributes выставлены в settings.locale=ru и settings.theme.base=dark. Flow title изменен на "Работайте во всех измерениях.". IdentificationStage теперь использует только email как идентификатор и привязан к штатному PasswordStage, поэтому email/password находятся в одном Authentik challenge без передачи пароля в Launcher. Отдельный PasswordStage binding удален из flow, MFA и UserLoginStage остаются штатными. @@ -440,7 +440,7 @@ Frontend Launcher подключен к /api/me и /api/apps. Без session Lau 2026-05-04 добавлен явный logout в профильное меню Launcher: кнопка "Выйти" вызывает /auth/logout и чистит local BFF session без ухода в Authentik UI/admin. Это нужно, чтобы пользователь оставался в NODE.DC UX после выхода. -SSO-session у identity provider может оставаться активной. Поэтому для пользовательского выхода Launcher использует global logout handoff: чистит локальную BFF session, закрывает downstream app sessions, best-effort вызывает Authentik end-session скрытым запросом и финально переводит пользователя в /auth/login?prompt=login. Это убирает промежуточную Authentik "Logout successful" страницу и принудительно показывает auth flow при следующем входе. +SSO-session у identity provider может оставаться активной, если не провести top-level logout через Authentik end-session. Поэтому для пользовательского выхода Launcher использует global logout handoff: чистит локальную BFF session, закрывает downstream app sessions, уводит браузер в Authentik end-session и возвращает через /auth/logged-out в /auth/login?prompt=login. Это убирает промежуточную Authentik "Logout successful" страницу и не дает прямому заходу в Task Manager молча перелогиниться через старую SSO session. 2026-05-04 login facade переведен на безопасную Authentik-native кастомизацию: Brand/CSS/template JS без proxy над password form. Окно приведено к NODE.DC/Plane визуальному канону, Authentik dashboard/logout application UI исключены из пользовательского маршрута, логотип синхронизирован с Launcher top bar по размеру и позиции. @@ -832,7 +832,7 @@ plane-app/docker-compose.yaml и plane-app/plane.env получили PLANE_NODE Plane web получил NODE.DC handoff для прямых заходов на task.local.nodedc: app/(home)/page.tsx показывает NodeDCAuthRedirect вместо AuthBase на NODE.DC-доменах; AuthenticationWrapper больше не возвращает unauthenticated users на /, а отправляет в /auth/oidc/login с сохранением next_path; api.service.ts при 401 и nodedc_access_revoked также уводит в OIDC handoff. Старый email/password экран Plane сохранен как standalone/fallback для не-NODE.DC доменов, но не должен появляться в нормальном local.notdc/task.local.nodedc сценарии. -Дополнение по logout semantics: Launcher /api/me теперь отдает global logout URL /auth/logout?global=1&returnTo=/. Launcher /auth/logout?global=1 сначала закрывает app sessions через front-channel logout URLs, затем скрыто вызывает Authentik end-session и финально уводит пользователя в /auth/login?prompt=login, а не на Authentik "Logout successful". Для Task Manager добавлен GET/POST /logout, который чистит Plane session и возвращает короткий технический ответ для front-channel. Стандартный Plane POST /auth/sign-out/ теперь после локального logout редиректит в PLANE_NODEDC_GLOBAL_LOGOUT_URL, поэтому кнопка выхода внутри Task Manager больше не должна мгновенно заводить пользователя обратно через активную SSO session. +Дополнение по logout semantics: Launcher /api/me теперь отдает global logout URL /auth/logout?global=1&returnTo=/. Launcher /auth/logout?global=1 сначала закрывает app sessions через front-channel logout URLs, затем top-level уводит браузер в Authentik end-session с post_logout_redirect_uri=/auth/logged-out и финально возвращает пользователя в /auth/login?prompt=login, а не на Authentik "Logout successful". Для Task Manager добавлен GET/POST /logout, который чистит Plane session и возвращает короткий технический ответ для front-channel. Стандартный Plane POST /auth/sign-out/ теперь после локального logout редиректит в PLANE_NODEDC_GLOBAL_LOGOUT_URL, поэтому кнопка выхода внутри Task Manager больше не должна мгновенно заводить пользователя обратно через активную SSO session. plane-src/apps/proxy/Caddyfile.ce маршрутизирует /logout в API, а plane-app/docker-compose.yaml монтирует этот Caddyfile в local proxy runtime, чтобы route не терялся при restart контейнера. В plane-app/plane.env добавлен PLANE_NODEDC_GLOBAL_LOGOUT_URL=http://launcher.local.nodedc/auth/logout?global=1&returnTo=/.