ФУНКЦИИ - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: Branded Authentik login
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
# NODE.DC branded login RFC
|
||||
|
||||
## Цель
|
||||
|
||||
Пользователь должен видеть единое окно входа NODE.DC в визуальной логике текущего Plane login: темный фон, компактная карточка, NODE.DC logo, крупный заголовок, email/password, яркая CTA-кнопка.
|
||||
|
||||
При этом Authentik остается внутренним identity provider и продолжает владеть паролями, MFA, recovery, lockout, session, OAuth/OIDC и audit events.
|
||||
|
||||
## Жесткие запреты
|
||||
|
||||
Запрещенные варианты реализации:
|
||||
|
||||
- reverse proxy, который переписывает HTML Authentik на лету;
|
||||
- frontend-only форма в Launcher, которая принимает email/password;
|
||||
- BFF endpoint в Launcher, который принимает пароль пользователя и пересылает его в Authentik;
|
||||
- OAuth password grant / ROPC;
|
||||
- хранение паролей, refresh tokens или Authentik session cookies в frontend/localStorage;
|
||||
- обход Authentik CSRF, MFA, recovery, lockout, enrollment и audit flow.
|
||||
|
||||
Эти варианты расширяют trusted boundary платформы: Launcher становится обработчиком паролей, а это ломает разделение ответственности и усложняет аудит.
|
||||
|
||||
## Выбранный безопасный путь
|
||||
|
||||
Базовый production-safe путь: Authentik-native branded flow.
|
||||
|
||||
- UI кастомизируется через Brand/Flow внутри Authentik.
|
||||
- `branding_custom_css` задает NODE.DC look без HTML-прокси.
|
||||
- Password stage, Identification stage, User Login stage, MFA/recovery остаются штатными Authentik stages.
|
||||
- Identification stage связан со штатным Password stage, поэтому email и password показываются в одном Authentik challenge без передачи пароля в Launcher.
|
||||
- Launcher и Task Manager остаются OIDC clients и не получают пароль пользователя.
|
||||
- Direct links на Launcher/Task Manager продолжают идти через Authorization Code Flow + PKCE.
|
||||
- OAuth2 provider end-session использует штатный Authentik invalidation flow с UserLogoutStage, чтобы пользователь не попадал на Authentik application logout dashboard.
|
||||
|
||||
Если Brand/CSS не даст pixel-level соответствие Plane login, следующий допустимый уровень — кастомный Authentik template/flow executor внутри Authentik deployment. Это тоже остается IdP-side custom UI, но требует отдельной security review при каждом upgrade Authentik.
|
||||
|
||||
## Runtime prototype
|
||||
|
||||
Локальный bootstrap настраивает Brand для `auth.local.nodedc`:
|
||||
|
||||
- title: `NODE.DC`;
|
||||
- default authentication flow: `default-authentication-flow`;
|
||||
- flow title: `Работайте во всех измерениях.`;
|
||||
- default locale: `ru`;
|
||||
- theme: `dark`;
|
||||
- dark NODE.DC CSS из `/templates/branding/nodedc-login.css`;
|
||||
- без изменения password/MFA/recovery mechanics.
|
||||
|
||||
Файлы:
|
||||
|
||||
- `infra/authentik/bootstrap-dev.py` — idempotent Brand/Flow bootstrap;
|
||||
- `infra/authentik/custom-templates/branding/nodedc-login.css` — native Authentik Brand CSS.
|
||||
|
||||
## Security acceptance
|
||||
|
||||
Перед переводом в production нужно проверить:
|
||||
|
||||
- пароль не проходит через Launcher/BFF/network logs вне Authentik;
|
||||
- CSRF token и Authentik cookies остаются штатными;
|
||||
- MFA/passkeys/recovery/enrollment работают после стилизации;
|
||||
- failed login/lockout/audit events остаются в Authentik;
|
||||
- logout/SLO закрывает Launcher и app sessions;
|
||||
- прямой заход `task.local.nodedc` и `launcher.local.nodedc` возвращает пользователя после login;
|
||||
- UI не содержит слова `authentik` в пользовательском flow;
|
||||
- кастомизация переживает restart контейнеров и повторный bootstrap;
|
||||
- fallback admin URL к Authentik остается доступен только как служебный контур.
|
||||
|
||||
## Upgrade policy
|
||||
|
||||
Brand/CSS считается безопасным maintenance layer. Template override считается повышенным риском: перед обновлением Authentik нужно прогонять visual/security regression, потому что DOM web components может измениться.
|
||||
|
||||
## Источники
|
||||
|
||||
- Authentik Flows: https://docs.goauthentik.io/docs/add-secure-apps/flows-stages/flow/
|
||||
- Authentik Stages: https://docs.goauthentik.io/docs/flow/stages
|
||||
- Password stage: https://docs.goauthentik.io/add-secure-apps/flows-stages/stages/password/
|
||||
- Custom CSS: https://docs.goauthentik.io/brands/custom-css/
|
||||
- Single Logout: https://docs.goauthentik.io/add-secure-apps/providers/single-logout/
|
||||
@@ -48,6 +48,8 @@ Production login должен быть NODE.DC-branded:
|
||||
|
||||
Запрещено делать быстрый frontend-only password form, который обходит IdP protections, хранит секреты в браузере или ломает MFA/recovery/audit.
|
||||
|
||||
Текущее безопасное решение зафиксировано в `docs/AUTH_BRANDED_LOGIN_RFC.md`: сначала используем Authentik-native Brand/CSS/Flow customization. Reverse proxy HTML-rewrite, password form в Launcher и пересылка пароля через BFF запрещены.
|
||||
|
||||
## Required claims
|
||||
|
||||
Минимальный normalized user object:
|
||||
|
||||
Reference in New Issue
Block a user