Перейти к содержанию

Single Sign-On (SSO)

AegisAI поддерживает корпоративный вход через внешние Identity Provider (IdP) по протоколу OpenID Connect (OIDC).

Поддерживаемые провайдеры

Провайдер Протокол Применение
Keycloak OIDC Самостоятельный хостинг
Okta OIDC Облачный IdP
Google Workspace OIDC Небольшие команды
Microsoft Entra ID OIDC Корпоративный Azure AD

SAML 2.0

SAML пока не реализован. Все перечисленные провайдеры поддерживают OIDC.

Схема аутентификации

sequenceDiagram
    participant User as Пользователь
    participant FE as Frontend
    participant API as AegisAI API
    participant IdP as Keycloak/Okta/...

    User->>FE: «Войти через SSO»
    FE->>API: GET /auth/sso/login?provider=keycloak
    API->>IdP: Redirect (code + state)
    User->>IdP: Логин/пароль
    IdP->>API: GET /auth/sso/callback?code=...&state=...
    API->>IdP: Обмен code на tokens
    API->>API: Проверка id_token (JWKS), создание пользователя
    API->>FE: Redirect /login?sso_code=...
    FE->>API: POST /auth/sso/exchange
    API-->>FE: JWT + api_key + user
    FE->>FE: Сессия, переход в dashboard

Безопасность: state/nonce, проверка подписи id_token через JWKS, JWT не передаётся в URL (одноразовый exchange code в Redis, TTL 120 с).

Включение SSO

Общие настройки

SSO_PUBLIC_BASE_URL=https://aegisai.example.com
SSO_FRONTEND_URL=https://aegisai.example.com
SSO_CALLBACK_URL=https://aegisai.example.com/api/v1/auth/sso/callback
SSO_DEFAULT_PROVIDER=keycloak
SSO_AUTO_PROVISION=true
SSO_SYNC_ROLES=true

Keycloak

KEYCLOAK_ENABLED=true
KEYCLOAK_CLIENT_ID=aegisai
KEYCLOAK_CLIENT_SECRET=your-client-secret
KEYCLOAK_ISSUER=https://keycloak.example.com/realms/master

Redirect URI в Keycloak: https://aegisai.example.com/api/v1/auth/sso/callback

Okta

OKTA_ENABLED=true
OKTA_CLIENT_ID=your-client-id
OKTA_CLIENT_SECRET=your-client-secret
OKTA_ISSUER=https://your-org.okta.com/oauth2/default

Google Workspace

GOOGLE_SSO_ENABLED=true
GOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=your-client-secret

Microsoft Entra ID

MICROSOFT_SSO_ENABLED=true
MICROSOFT_TENANT_ID=your-tenant-id
MICROSOFT_CLIENT_ID=your-application-id
MICROSOFT_CLIENT_SECRET=your-client-secret

Маппинг ролей

Роль AegisAI Примеры групп IdP
super_admin super_admin, aegis-super-admin
admin admin, Admins
security_analyst SecurityAnalysts
developer Developers
viewer по умолчанию

Кастомный маппинг:

SSO_ROLE_MAPPING_JSON={"admin":["Corp-Admins"],"super_admin":["Platform-Admins"]}

API

Метод Endpoint Описание
GET /auth/sso/providers Список включённых IdP
GET /auth/sso/login?provider=... Начало OIDC
GET /auth/sso/callback Callback от IdP
POST /auth/sso/exchange Обмен code на JWT

Миграция

docker compose exec app poetry run alembic upgrade head

Миграция 006_sso_fields добавляет auth_provider, external_subject, делает password_hash nullable.

Устранение неполадок

Проблема Решение
Нет кнопок SSO на login Проверьте *_ENABLED=true, client_id; вызовите /auth/sso/providers
invalid_state Истёк flow или cookies заблокированы
redirect_uri mismatch URL в IdP = SSO_CALLBACK_URL
Роль viewer Настройте группы в IdP и SSO_ROLE_MAPPING_JSON

См. также