Skip to content
ВозможностиДокументацияЦеныПартнёрыPlaygroundFAQ

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. Переменные окружения

bash
1# SAML configuration (relay)
2SAML_ENABLED=true
3SAML_IDP_METADATA_URL=https://your-idp.example.com/saml/metadata
4SAML_SP_ENTITY_ID=https://flowlink.example.com
5SAML_ASSERTION_CONSUMER=https://flowlink.example.com/auth/saml/acs
6SAML_SIGN_CERT=/etc/flowlink/certs/sp.crt
7SAML_SIGN_KEY=/etc/flowlink/certs/sp.key
8SAML_NAME_ID_FORMAT=emailAddress
9SAML_ATTRIBUTE_MAPPING=email:email,firstName:first_name,lastName:last_name,groups:groups

2. Генерация SP сертификатов

bash
1# Генерация самоподписанного сертификата для SP
2openssl 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

bash
1# Получить SP metadata XML
2curl -s https://flowlink.example.com/auth/saml/metadata
3
4# Или через API
5curl -s "https://api.flowlink.io/v1/sso/saml/metadata" \
6 -H "Authorization: Bearer $TOKEN"

4. Тестирование

bash
1# Инициировать SSO login
2curl -L https://flowlink.example.com/auth/saml/login
3
4# После логина: JWT токен в redirect
5curl https://flowlink.example.com/api/v1/agents \
6 -H "Authorization: Bearer $JWT"

Настройка OIDC

FlowLink поддерживает OIDC Authorization Code Flow с Discovery. Конфигурация минимальна — достаточно указать issuer URL.

bash
1# OIDC configuration
2OIDC_ENABLED=true
3OIDC_ISSUER=https://accounts.google.com
4OIDC_CLIENT_ID=your-client-id.apps.googleusercontent.com
5OIDC_CLIENT_SECRET=your-client-secret
6OIDC_REDIRECT_URI=https://flowlink.example.com/auth/oidc/callback
7OIDC_SCOPES=openid,email,profile,groups

Identity Providers

FlowLink проверен с следующими Identity Providers. Для каждого приведены специфичные настройки.

KeycloakSAML 2.0 + OIDC

Realm Settings → Clients → Create → Client ID = flowlink → Valid Redirect URIs → Copy SAML Metadata URL

Azure AD (Entra ID)SAML 2.0 + OIDC

Azure Portal → Enterprise Applications → New → Non-gallery → Setup SSO → Copy Metadata URL → Configure identifier and reply URL

OktaSAML 2.0 + OIDC

Okta Admin → Applications → Create App Integration → SAML 2.0 → General → SSO URL = FlowLink ACS → Attribute Statements → Download Metadata

Google WorkspaceOIDC

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 TTL15 минут
Refresh Token TTL7 дней
Алгоритм подписиRS256
Claimssub, org_id, role, scopes, exp, iat, email, name
json
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": 1705332900
10}

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

Роли пользователей определяются из SAML attribute или OIDC claim. Атрибут flowlink_role или группа пользователя маппится на FlowLink роль.

xml
1<!-- SAML Attribute для роли -->
2<saml:Attribute Name="flowlink_role">
3 <saml:AttributeValue>admin</saml:AttributeValue>
4</saml:Attribute>
5
6<!-- Или через группы -->
7<saml:Attribute Name="groups">
8 <saml:AttributeValue>flowlink-admins</saml:AttributeValue>
9 <saml:AttributeValue>flowlink-operators</saml:AttributeValue>
10</saml:Attribute>
SAML / OIDC RoleFlowLink RoleПрава
admin / flowlink-adminsAdminПолный доступ, управление пользователем
operator / flowlink-operatorsOperatorВыполнение команд, approvals, audit
viewer / flowlink-viewersViewerТолько чтение dashboard и отчётов
*Viewer (default)Если роль не распознана

Auto-provisioning (SCIM 2.0)

SCIM 2.0 (System for Cross-domain Identity Management) позволяет автоматически создавать, обновлять и деактивировать пользователей в FlowLink при изменениях в IdP. Поддерживаются Keycloak, Azure AD и Okta как SCIM провайдеры.

bash
1# SCIM Configuration
2SCIM_ENABLED=true
3SCIM_BEARER_TOKEN=scim_provisioning_token_xxxxx
4
5# 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 SSO
POST /auth/saml/acsSAML Assertion Consumer Service
GET /auth/saml/metadataSP Metadata XML
GET /auth/oidc/authorizeOIDC Authorization Endpoint
GET /auth/oidc/callbackOIDC Callback
POST /auth/token/refreshОбновить JWT
POST /auth/logoutLogout (invalidate JWT + IdP logout)

API Reference

GET /api/v1/sso/statusСтатус SSO конфигурации
GET /api/v1/sso/saml/metadataSP Metadata XML
POST /api/v1/sso/saml/testТест SAML подключения
GET /api/v1/sso/oidc/discoveryOIDC Discovery document
POST /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

bash
1curl -s "https://api.flowlink.io/v1/sso/status" \
2 -H "Authorization: Bearer $TOKEN" | jq
json
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": 450
13 }
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": 0
26 }
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.

Edit this page