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 |
по умолчанию |
Кастомный маппинг:
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 |
Миграция¶
Миграция 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 |