АРХ - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: Authentik profile projection
This commit is contained in:
+65
-7
@@ -1,10 +1,16 @@
|
||||
# Auth Model
|
||||
|
||||
## Identity source
|
||||
## Identity и control-plane source
|
||||
|
||||
Единственный источник identity: Authentik.
|
||||
Пользовательский и административный источник истины: Launcher backend.
|
||||
|
||||
Launcher, Plane и будущие приложения не хранят пароли пользователей и не становятся главным источником truth по логину.
|
||||
Launcher владеет продуктовыми сущностями платформы: клиенты/компании, участники, роли клиента, группы клиента, инвайты, доступы к сервисам, audit log и пользовательский профиль платформы.
|
||||
|
||||
Authentik остается внутренним identity/session слоем. Он хранит техническую identity, password/session/MFA/OIDC и получает из Launcher только синхронизированную проекцию, нужную для SSO: пользователей, enrollment/reset flows, группы/entitlements и профильные claims.
|
||||
|
||||
Пользователь и обычный администратор не должны видеть бренд Authentik в платформенном UI. Прямой доступ к Authentik допускается только через отдельную внутреннюю/служебную ссылку для системной настройки.
|
||||
|
||||
Plane и будущие приложения не хранят пароли пользователей и не становятся главным источником truth по платформенному пользователю. Они принимают OIDC/session claims и связывают их со своими локальными доменными моделями.
|
||||
|
||||
## User journey
|
||||
|
||||
@@ -23,6 +29,25 @@ UI платформы не должен показывать пользоват
|
||||
|
||||
Прямые ссылки на приложения остаются допустимым пользовательским сценарием. Если session нет, приложение или внешний proxy/auth layer должен увести пользователя в login flow и после успешного входа вернуть к исходному приложению.
|
||||
|
||||
## Platform login UX
|
||||
|
||||
Текущий hosted Authentik login допустим только как dev/runtime bootstrap для проверки OIDC, JWKS, session и app redirect.
|
||||
|
||||
Production login должен быть NODE.DC-branded:
|
||||
|
||||
- пользователь видит только NODE.DC экран входа;
|
||||
- тексты, ошибки, recovery/enrollment и logout не светят бренд Authentik;
|
||||
- Authentik остается внутренним password/session/MFA/OIDC слоем;
|
||||
- пароль, service tokens и refresh tokens не попадают во frontend bundle;
|
||||
- прямые ссылки на Launcher/Task Manager/future apps ведут через этот же NODE.DC login facade и возвращают пользователя в исходное приложение.
|
||||
|
||||
Допустимые реализации:
|
||||
|
||||
1. Кастомизированный Authentik flow, если его можно привести к NODE.DC UX без компромиссов по дизайну.
|
||||
2. Launcher/BFF login facade, который server-side вызывает внутренний Authentik flow/API и сохраняет безопасность IdP.
|
||||
|
||||
Запрещено делать быстрый frontend-only password form, который обходит IdP protections, хранит секреты в браузере или ломает MFA/recovery/audit.
|
||||
|
||||
## Required claims
|
||||
|
||||
Минимальный normalized user object:
|
||||
@@ -32,6 +57,7 @@ type AuthUser = {
|
||||
sub: string;
|
||||
email: string;
|
||||
name?: string;
|
||||
avatarUrl?: string | null;
|
||||
groups: string[];
|
||||
entitlements?: string[];
|
||||
};
|
||||
@@ -44,7 +70,8 @@ type AuthUser = {
|
||||
- `exp` не истек;
|
||||
- `sub` непустой и стабилен;
|
||||
- `email` присутствует для user-facing приложений;
|
||||
- `groups` или `entitlements` содержат требуемый app access.
|
||||
- `name`, `picture`/`avatar_url` используются как единый профильный контекст, но мастер-данные профиля должны приходить из Launcher;
|
||||
- `groups` или `entitlements` содержат требуемую техническую app access projection.
|
||||
|
||||
## Groups
|
||||
|
||||
@@ -79,9 +106,11 @@ nodedc:dm:access
|
||||
|
||||
## Access levels
|
||||
|
||||
Уровень 1: Authentik app access.
|
||||
Уровень 1: Launcher access model.
|
||||
|
||||
Отвечает на вопрос, можно ли открыть приложение.
|
||||
Отвечает на вопрос, можно ли открыть приложение. Источник решения — данные Launcher: клиент, членство, группы клиента, user grants, deny exceptions, статус сервиса и период доступа.
|
||||
|
||||
Authentik app access является технической проекцией этого решения для SSO/enforcement, а не местом ручного бизнес-администрирования.
|
||||
|
||||
Launcher показывает каталог приложений как витрину, а не скрывает все недоступные плитки. Для приложения без доступа кнопка перехода отключена и отображается состояние "Нет доступа". Это важно для продаж, onboarding и понимания доступных модулей платформы.
|
||||
|
||||
@@ -98,11 +127,28 @@ Launcher показывает каталог приложений как вит
|
||||
Backend должен:
|
||||
|
||||
- хранить Authentik service token только server-side;
|
||||
- выполнять admin calls к Authentik API;
|
||||
- хранить клиентов, пользователей, членства, группы, инвайты, grants/exceptions и профиль платформы;
|
||||
- выполнять server-side sync в Authentik API без раскрытия Authentik пользователю;
|
||||
- создавать invite/enrollment flows из Launcher UI;
|
||||
- хранить audit log;
|
||||
- возвращать frontend только нормализованные данные пользователя и разрешенные действия;
|
||||
- не отдавать access/refresh/service tokens в browser bundle.
|
||||
|
||||
## Live control-plane data rule
|
||||
|
||||
Демо-пользователи Launcher допустимы только как fixture на этапе frontend MVP.
|
||||
|
||||
Как только появляется backend/admin API, Launcher control-plane должен перейти на живой seed:
|
||||
|
||||
- реальные платформенные пользователи вместо `root@nodedc.local`, `ivan@romashka.ru` и прочих декоративных участников;
|
||||
- явный superadmin NODE.DC;
|
||||
- реальные клиентские пользователи и группы, подтвержденные по Plane/Auth/Launcher данным;
|
||||
- idempotent seed/migration script с backup текущего `launcher-data.json`;
|
||||
- отсутствие прямого изменения Plane users/workspace/task данных из Launcher seed;
|
||||
- все дальнейшие проверки клиентов, групп, инвайтов и доступов выполняются через Launcher admin UI.
|
||||
|
||||
Если пользователь существует в Plane, но еще не существует в Authentik, он должен быть заведен через Launcher/Auth sync flow, а не ручным рассинхроном.
|
||||
|
||||
## Plane identity link
|
||||
|
||||
Минимальная таблица или эквивалентная модель в Plane:
|
||||
@@ -124,3 +170,15 @@ external_identity_link
|
||||
- если link найден, логинить связанный `plane_user_id`;
|
||||
- если link не найден, но email совпадает и включен migration auto-link, создать link;
|
||||
- если доступа нет, вернуть deny.
|
||||
|
||||
## Plane standalone compatibility
|
||||
|
||||
Plane является подключаемым приложением NODE.DC, но не должен становиться технически невынимаемым модулем.
|
||||
|
||||
Правила интеграции:
|
||||
|
||||
- OIDC NODE.DC добавляется как отдельный auth provider path, а не как замена всей Plane auth системы;
|
||||
- стандартные Plane session/API-token возможности сохраняются, пока нет отдельного решения их убрать;
|
||||
- Launcher хранит только платформенные привязки и access projection, но не владеет Plane workspace/project/task/comment;
|
||||
- связь с Plane строится через external identity link и будущий service adapter/API, а не через прямое изменение Plane DB из Launcher;
|
||||
- env-флаги должны позволять включать NODE.DC SSO в составе платформы и выключать его для standalone-поставки Plane.
|
||||
|
||||
Reference in New Issue
Block a user