Перейти к содержанию
KeuralDocs
Для разработчиков

Спецификация интеграции SSO·SCIM

Спецификация значений и поведения для интеграции OIDC, SAML 2.0 и SCIM 2.0.

Порядок настройки на экране см. в разделе SSO и SCIM.

В таблицах {API} указан адрес API Keural для используемой среды (например, https://api.keural.ai). Используйте адрес, который показан на экране Управление организацией → SSO.

Сводка значений для регистрации

ПараметрЗначение
URI перенаправления OIDC{API}/api/sso/callback
Начало входа OIDC·SAML{API}/api/sso/{orgId}/login
SAML SP EntityID{API}/api/sso/saml/metadata
SAML ACS URL{API}/api/sso/saml/callback
SCIM Base URL{API}/scim/v2

Вход всегда начинается со стороны Keural (SP-initiated). Если на экране входа ввести адрес электронной почты из зарегистрированного домена, выполняется переход на адрес начала входа. При успехе открывается главный экран Keural, при ошибке происходит возврат на /login?error=sso.

OIDC

ПараметрПоведение
ПотокAuthorization Code
Запрос authorizeresponse_type=code, client_id, redirect_uri, scope=openid email profile, state, nonce
state · nonceОдноразовые, действительны 10 минут. Если окно входа открыто дольше 10 минут, вход начинается заново.
Обмен токенаPOST на token endpoint, application/x-www-form-urlencoded. Аутентификация клиента: client_secret_post (client_id и client_secret в теле запроса).
Подпись ID-токенаПринимается только RS256. Ключ ищется в jwks_uri по kid.
Проверка ID-токенаПодпись, exp, aud содержит client_id, nonce совпадает, iss совпадает с Issuer URL (завершающий / игнорируется)
EmailУтверждение email в ID-токене. Если его нет, userinfo endpoint вызывается с Authorization: Bearer <access_token>, и email читается оттуда.
ИмяУтверждение name в ID-токене
EndpointsИщутся в /.well-known/openid-configuration по адресу Issuer URL. Если IdP не удаётся найти, адреса authorization, token, JWKS и userinfo вводятся напрямую в Показать расширенные настройки.
Ограничение по времени15 секунд на каждый вызов IdP

Приложение IdP должно разрешать client_secret_post. Если разрешены только client_secret_basic или private_key_jwt, обмен токена завершится ошибкой.

SAML 2.0

ПараметрПоведение
ЗапросAuthnRequest отправляется через привязку HTTP-Redirect. Запрос не подписывается.
Содержимое запросаDestination = IdP SSO URL, AssertionConsumerServiceURL = ACS URL, ProtocolBinding = HTTP-POST, Issuer = SP EntityID, NameIDPolicy Format=…:nameid-format:unspecified, AllowCreate=true
ОтветПривязка HTTP-POST, SAMLResponse и RelayState. RelayState должен возвращаться в том же значении, которое отправил Keural.
ПодписьВ Response или Assertion должна быть действительная подпись. Для проверки используется только сертификат, зарегистрированный на экране.
AssertionВ ответе должно быть ровно одно утверждение (Assertion). Зашифрованные утверждения (EncryptedAssertion) не принимаются.
СтатусStatusCode: urn:oasis:names:tc:SAML:2.0:status:Success
IssuerЕсли указан IdP EntityID, он должен совпадать с Issuer в утверждении.
УсловияNotBefore и NotOnOrAfter (допуск 300 секунд), Audience = SP EntityID
SubjectConfirmationDataRecipient = ACS URL, NotOnOrAfter (допуск 300 секунд), InResponseTo = ID запроса, который отправил Keural
EmailАтрибут, у которого Name или FriendlyName имеет одно из следующих значений (без учёта регистра): email, mail, emailAddress, E-Mail-Addresses, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress. Если таких нет, используется NameID, содержащий @.
ИмяdisplayName, name, cn, http://schemas.microsoft.com/identity/claims/displayname
СертификатОдин X.509-сертификат, в формате PEM или Base64 (DER). Для замены введите новый сертификат и сохраните.
МетаданныеВместо загрузки XML метаданных IdP введите три значения: IdP EntityID, IdP SSO URL и сертификат.

Сопоставление пользователя

ПараметрПоведение
Условие перенаправления в SSOЧасть адреса после @ точно совпадает с одним из значений списка Домены электронной почты (без учёта регистра). Поддомены регистрируются отдельно.
Поиск аккаунтаАккаунт Keural ищется по адресу электронной почты (в нижнем регистре), который вернул IdP.
Если аккаунта нетЕсли включено Автоматически создавать пользователей при первом входе (JIT), аккаунт создаётся. Если выключено, вход отклоняется.
Вступление в организациюЕсли пользователь не является участником организации, он вступает как Член. Аккаунт, у которого заняты все места или который принадлежит другой организации, может войти, но не вступает в организацию.
Условия сохранения домена электронной почтыДомены, подтверждённые через DNS TXT. Публичные почтовые домены исключаются.

Подтверждение домена

ПараметрЗначение
Тип записиTXT
ХостЗарегистрированный домен как есть (например, acme.com). Префиксный поддомен не используется.
Значениеkeural-verify=<UUID>, точно как показано на экране
Момент проверкиПроверяется один раз при нажатии Подтвердить проверку.

SCIM 2.0

ПараметрЗначение
Base URL{API}/scim/v2
АутентификацияAuthorization: Bearer <SCIM-токен>. Токен начинается с scim_ и показывается только один раз при выпуске.
Content-TypeЗапрос: application/scim+json или application/json. Ответ: application/scim+json
Коды состоянияВозвращаются реальные коды HTTP. Тело ошибки имеет формат SCIM Error (schemas, status, detail, scimType).

Endpoints

МетодПутьПоведение
GET/UsersСписок. filter=userName eq "…", startIndex (по умолчанию 1), count (по умолчанию 100, максимум 200)
GET/Users/{id}Получить одного пользователя
POST/UsersСоздать (201). Если такой email уже есть, возвращается 409.
PATCH/Users/{id}Изменить active, displayName, name.formatted, name.givenName
PUT/Users/{id}Применяет displayName, name и active. Если active не указан, пользователь считается активным.
DELETE/Users/{id}Приостанавливает аккаунт (204). Данные не удаляются.
GET/Groups, /Groups/{id}Получить две фиксированные группы. filter=displayName eq "…"
PATCH/Groups/{id}Добавить, удалить или заменить участников
GET/ServiceProviderConfig, /ResourceTypes, /SchemasПолучить поддерживаемые возможности

Атрибуты пользователя

АтрибутНазначение
userNameEmail. Если его нет, используется emails[0].value.
displayName · name.formatted · name.givenName+name.familyNameОтображаемое имя
activefalse: приостановка (блокирует вход), true: восстановление
idID пользователя Keural. Содержится в ответе.

externalId не сохраняется. Чтобы найти пользователя в IdP, используйте фильтр userName.

Группы

iddisplayNameПри добавлении участникаПри удалении участника
keural-adminsKeural AdminsАдминистраторЧлен
keural-membersKeural MembersЧленБез изменений

Роль владельца организации через SCIM не меняется. Создание и удаление групп (POST и DELETE /Groups) возвращает 501. value участника группы: ID пользователя Keural (id из /Users).

Поддерживаемые возможности

ВозможностьПоддержка
PATCHДа
ФильтрыuserName eq, displayName eq
Bulk · сортировка · ETag · смена пароляНет

Ошибки

СтатусscimTypeПричина
400invalidValueОтсутствуют и userName, и emails
401—Токен отсутствует или неверен, либо SCIM-подготовка отключена
404—Пользователь или группа не принадлежат этой организации
409uniquenessАккаунт с таким email уже существует, или превышено число мест
501—Создание или удаление групп

На этой странице