SSO / SAML
Single Sign-On через SAML 2.0 и OIDC для Enterprise: Keycloak, Azure AD, Okta, Google Workspace
🔒 Enterprise только
Обзор
FlowLink поддерживает SAML 2.0 и OIDC (OpenID Connect) для аутентификации через корпоративный Identity Provider (IdP). Пользователи авторизуются через Okta, Azure AD, Keycloak, Google Workspace и другие IdP, а FlowLink выдаёт JWT токены с ролями из SAML assertions. Поддерживается SCIM 2.0 provisioning для автоматической синхронизации пользователей и групп.
SAML 2.0
Keycloak, Azure AD, Okta
Enterprise
OIDC
Google Workspace, GitHub, Yandex
Enterprise
SCIM 2.0
Авто-синхронизация пользователей
Enterprise
JWT
RS256 подпись, 15min TTL
Enterprise
Архитектура
FlowLink выступает как Service Provider (SP) в SAML и как Relying Party (RP) в OIDC. Аутентификация происходит через внешний IdP. После успешного логина FlowLink получает user attributes (email, name, groups, roles), создаёт или обновляет локальную учётную запись и выдаёт JWT токен.
# SAML Flow:
1. Инициация:
User → FlowLink SP → redirect to IdP
# 2. Аутентификация:
User logs in at IdP → IdP generates SAML Response
# 3. Assertion:
IdP POST → FlowLink ACS → validate signature → extract attributes
# 4. Token:
Create/update user → issue JWT (RS256, 15min)
# OIDC Flow:
1. Инициация:
User → /auth/oidc/authorize → redirect to Provider
# 2. Callback:
Provider → /auth/oidc/callback → exchange code for tokens
# 3. UserInfo:
Fetch user profile → create/update user → issue JWT
Настройка SAML 2.0
1. Переменные окружения
1# SAML configuration (relay)2SAML_ENABLED=true3SAML_IDP_METADATA_URL=https://your-idp.example.com/saml/metadata4SAML_SP_ENTITY_ID=https://flowlink.example.com5SAML_ASSERTION_CONSUMER=https://flowlink.example.com/auth/saml/acs6SAML_SIGN_CERT=/etc/flowlink/certs/sp.crt7SAML_SIGN_KEY=/etc/flowlink/certs/sp.key8SAML_NAME_ID_FORMAT=emailAddress9SAML_ATTRIBUTE_MAPPING=email:email,firstName:first_name,lastName:last_name,groups:groups
2. Генерация SP сертификатов
1# Генерация самоподписанного сертификата для SP2openssl req -x509 -newkey rsa:2048 -nodes \3 -keyout /etc/flowlink/certs/sp.key \4 -out /etc/flowlink/certs/sp.crt \5 -days 365 -subj "/CN=flowlink.example.com"
3. SP Metadata для IdP
1# Получить SP metadata XML2curl -s https://flowlink.example.com/auth/saml/metadata34# Или через API5curl -s "https://api.flowlink.io/v1/sso/saml/metadata" \6 -H "Authorization: Bearer $TOKEN"
4. Тестирование
1# Инициировать SSO login2curl -L https://flowlink.example.com/auth/saml/login34# После логина: JWT токен в redirect5curl https://flowlink.example.com/api/v1/agents \6 -H "Authorization: Bearer $JWT"
Настройка OIDC
FlowLink поддерживает OIDC Authorization Code Flow с Discovery. Конфигурация минимальна — достаточно указать issuer URL.
1# OIDC configuration2OIDC_ENABLED=true3OIDC_ISSUER=https://accounts.google.com4OIDC_CLIENT_ID=your-client-id.apps.googleusercontent.com5OIDC_CLIENT_SECRET=your-client-secret6OIDC_REDIRECT_URI=https://flowlink.example.com/auth/oidc/callback7OIDC_SCOPES=openid,email,profile,groups
Identity Providers
FlowLink проверен с следующими Identity Providers. Для каждого приведены специфичные настройки.
Realm Settings → Clients → Create → Client ID = flowlink → Valid Redirect URIs → Copy SAML Metadata URL
Azure Portal → Enterprise Applications → New → Non-gallery → Setup SSO → Copy Metadata URL → Configure identifier and reply URL
Okta Admin → Applications → Create App Integration → SAML 2.0 → General → SSO URL = FlowLink ACS → Attribute Statements → Download Metadata
Google Cloud Console → APIs & Services → Credentials → OAuth 2.0 Client ID → Configure redirect URI → Enable Google Identity
JWT Tokens
После успешной аутентификации FlowLink выдаёт JWT access token и refresh token. Token содержит claims о пользователе, организации, роли и scopes.
| Свойство | Значение |
|---|---|
| Access Token TTL | 15 минут |
| Refresh Token TTL | 7 дней |
| Алгоритм подписи | RS256 |
| Claims | sub, org_id, role, scopes, exp, iat, email, name |
1{2 "sub": "user_abc123",3 "email": "admin@company.com",4 "name": "John Doe",5 "org_id": "org_xyz",6 "role": "admin",7 "scopes": ["agents:read", "agents:write", "policy:read"],8 "iat": 1705332000,9 "exp": 170533290010}
Маппинг ролей
Роли пользователей определяются из SAML attribute или OIDC claim. Атрибут flowlink_role или группа пользователя маппится на FlowLink роль.
1<!-- SAML Attribute для роли -->2<saml:Attribute Name="flowlink_role">3 <saml:AttributeValue>admin</saml:AttributeValue>4</saml:Attribute>56<!-- Или через группы -->7<saml:Attribute Name="groups">8 <saml:AttributeValue>flowlink-admins</saml:AttributeValue>9 <saml:AttributeValue>flowlink-operators</saml:AttributeValue>10</saml:Attribute>
| SAML / OIDC Role | FlowLink Role | Права |
|---|---|---|
| admin / flowlink-admins | Admin | Полный доступ, управление пользователем |
| operator / flowlink-operators | Operator | Выполнение команд, approvals, audit |
| viewer / flowlink-viewers | Viewer | Только чтение dashboard и отчётов |
| * | Viewer (default) | Если роль не распознана |
Auto-provisioning (SCIM 2.0)
SCIM 2.0 (System for Cross-domain Identity Management) позволяет автоматически создавать, обновлять и деактивировать пользователей в FlowLink при изменениях в IdP. Поддерживаются Keycloak, Azure AD и Okta как SCIM провайдеры.
1# SCIM Configuration2SCIM_ENABLED=true3SCIM_BEARER_TOKEN=scim_provisioning_token_xxxxx45# SCIM Base URL (provide to IdP)6SCIM_BASE_URL=https://flowlink.example.com/scim/v2
GET /scim/v2/UsersСписок пользователейPOST /scim/v2/UsersСоздать пользователя (auto-provision)GET /scim/v2/Users/{id}Получить пользователяPATCH /scim/v2/Users/{id}Обновить пользователяDELETE /scim/v2/Users/{id}Деактивировать пользователяGET /scim/v2/GroupsСписок группPOST /scim/v2/GroupsСоздать группуЭндпоинты аутентификации
GET /auth/saml/loginИнициировать SAML SSOPOST /auth/saml/acsSAML Assertion Consumer ServiceGET /auth/saml/metadataSP Metadata XMLGET /auth/oidc/authorizeOIDC Authorization EndpointGET /auth/oidc/callbackOIDC CallbackPOST /auth/token/refreshОбновить JWTPOST /auth/logoutLogout (invalidate JWT + IdP logout)API Reference
GET /api/v1/sso/statusСтатус SSO конфигурацииGET /api/v1/sso/saml/metadataSP Metadata XMLPOST /api/v1/sso/saml/testТест SAML подключенияGET /api/v1/sso/oidc/discoveryOIDC Discovery documentPOST /api/v1/sso/oidc/testТест OIDC подключенияGET /api/v1/sso/sessionsАктивные сессииDELETE /api/v1/sso/sessions/{id}Завершить сессиюGET /api/v1/sso/usersSSO-пользователиGET /api/v1/sso/scim/statusSCIM provisioning статусПример: статус SSO
1curl -s "https://api.flowlink.io/v1/sso/status" \2 -H "Authorization: Bearer $TOKEN" | jq
1{2 "saml": {3 "enabled": true,4 "idp_metadata_url": "https://keycloak.example.com/realms/flowlink/protocol/saml/descriptor",5 "sp_entity_id": "https://flowlink.example.com",6 "acs_url": "https://flowlink.example.com/auth/saml/acs",7 "idp_name": "Keycloak",8 "certificate_expires": "2027-01-15T00:00:00Z",9 "last_test": {10 "status": "success",11 "tested_at": "2026-01-15T14:00:00Z",12 "response_time_ms": 45013 }14 },15 "oidc": {16 "enabled": true,17 "issuer": "https://accounts.google.com",18 "client_id": "your-client-id.apps.googleusercontent.com",19 "scopes": ["openid", "email", "profile"]20 },21 "scim": {22 "enabled": true,23 "total_users_synced": 142,24 "last_sync_at": "2026-01-15T13:45:00Z",25 "sync_errors": 026 }27}
Устранение неполадок
SAML login не работает
Проверьте IDP metadata URL — он должен быть доступен с relay. Убедитесь, что SP Entity ID в IdP совпадает с SAML_SP_ENTITY_ID. Проверьте сертификаты SP — они должны быть валидными.
Роли не маппятся
Убедитесь, что IdP передаёт attribute flowlink_role или groups в SAML Assertion. Проверьте attribute mapping в конфигурации. Используйте POST /sso/saml/test для диагностики.
SCIM sync не работает
Проверьте SCIM_BEARER_TOKEN — он должен совпадать в FlowLink и IdP. Убедитесь в доступности SCIM endpoint. Проверьте GET /sso/scim/status для деталей последней синхронизации.
JWT быстро истекает
Access Token TTL — 15 минут. Используйте Refresh Token для получения нового. POST /auth/token/refresh с refresh token возвращает новую пару access + refresh tokens.
SP certificate expired
Проверьте срок действия SP сертификата через GET /sso/status (certificate_expires). Сгенерируйте новый сертификат и обновите в IdP. Рекомендуется renewal за 30 дней до истечения.
Лучшие практики
Используйте SCIM для user management
Автоматизируйте создание и деактивацию пользователей через SCIM. Не управляйте пользователями вручную при включённом SSO.
Настройте группы для RBAC
Маппьте группы IdP на FlowLink роли. Это упрощает управление доступом при изменении состава команды.
Тестируйте SSO перед production
Используйте POST /sso/saml/test и POST /sso/oidc/test для проверки конфигурации до включения SSO для всех пользователей.
Мониторьте certificate expiration
Настройте алерт за 30 дней до истечения SP сертификата. Обновление сертификата требует downtime.
Используйте IdP-initiated logout
Настройте Single Logout (SLO) для инвалидации JWT при logout из IdP. Это предотвращает использование токенов после logout.