Ir al contenido
KeuralDocs
Desarrolladores

Especificación de integración SSO y SCIM

Valores y comportamiento necesarios para la integración OIDC, SAML 2.0 y SCIM 2.0.

Para el orden de configuración en pantalla, consulte SSO y SCIM.

En las tablas, {API} es la dirección de la API de Keural del entorno que utiliza (por ejemplo, https://api.keural.ai). Para obtener el valor exacto, use la dirección que aparece en Gestión de la organización → Configuración de SSO.

Resumen de valores de registro

ElementoValor
URI de redirección OIDC{API}/api/sso/callback
Inicio de sesión OIDC·SAML{API}/api/sso/{orgId}/login
EntityID del SP SAML{API}/api/sso/saml/metadata
URL de ACS SAML{API}/api/sso/saml/callback
URL base de SCIM{API}/scim/v2

El inicio de sesión siempre empieza en Keural (SP-initiated). Si introduce un correo de un dominio registrado en la pantalla de inicio de sesión, se le redirige a la dirección de inicio de sesión. Si el inicio de sesión se completa, vuelve a la pantalla principal de Keural; si falla, regresa a /login?error=sso.

OIDC

ElementoComportamiento
FlujoAuthorization Code
Solicitud authorizeresponse_type=code, client_id, redirect_uri, scope=openid email profile, state, nonce
state · nonceDe un solo uso y válidos durante 10 minutos. Si deja la ventana de inicio de sesión abierta más de 10 minutos, tendrá que volver a iniciar sesión desde el principio.
Intercambio de tokenPOST al token endpoint, application/x-www-form-urlencoded. La autenticación del cliente es client_secret_post (client_id y client_secret en el cuerpo).
Firma del ID tokenSolo acepta RS256. La clave se busca en jwks_uri mediante kid.
Validación del ID tokenFirma, exp, aud que incluya el client_id, nonce coincidente, y iss igual a la Issuer URL (se ignora la / final).
CorreoLa notificación email del ID token. Si no existe, se consulta el userinfo endpoint con Authorization: Bearer <access_token> y se lee email.
NombreLa notificación name del ID token
EndpointsSe localizan en /.well-known/openid-configuration de la Issuer URL. Si el IdP no se encuentra, introduzca manualmente las direcciones de authorization, token, JWKS y userinfo en Mostrar ajustes avanzados.
Tiempo límite15 segundos por cada llamada al IdP

La aplicación del IdP debe permitir client_secret_post. Si la configuración solo permite client_secret_basic o private_key_jwt, el intercambio de token fallará.

SAML 2.0

ElementoComportamiento
SolicitudEnvía un AuthnRequest mediante el enlace HTTP-Redirect. La solicitud no se firma.
Contenido de la solicitudDestination=URL de SSO del IdP, AssertionConsumerServiceURL=URL de ACS, ProtocolBinding=HTTP-POST, Issuer=EntityID del SP, NameIDPolicy Format=…:nameid-format:unspecified, AllowCreate=true
RespuestaEnlace HTTP-POST con SAMLResponse y RelayState. El RelayState debe devolverse exactamente como lo envió Keural.
FirmaLa respuesta o la aserción debe tener una firma válida. La clave de verificación es solo el certificado registrado en la pantalla.
AserciónLa respuesta debe contener exactamente una aserción. No se aceptan aserciones cifradas (EncryptedAssertion).
EstadoStatusCode igual a urn:oasis:names:tc:SAML:2.0:status:Success
IssuerSi introdujo el EntityID del IdP, debe coincidir con el Issuer de la aserción
CondicionesNotBefore y NotOnOrAfter (tolerancia de 300 segundos), Audience=EntityID del SP
SubjectConfirmationDataRecipient=URL de ACS, NotOnOrAfter (tolerancia de 300 segundos), InResponseTo=ID de la solicitud enviada por Keural
CorreoUn atributo cuyo Name o FriendlyName sea uno de los siguientes (sin distinguir mayúsculas): email, mail, emailAddress, E-Mail-Addresses, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress. Si no existe, se usa el NameID que contenga @.
NombredisplayName, name, cn, http://schemas.microsoft.com/identity/claims/displayname
CertificadoUn certificado X.509. Puede estar en PEM o en Base64 (DER). Para cambiarlo, introduzca el nuevo certificado y guarde.
MetadatosEn lugar de subir el XML de metadatos del IdP, introduzca tres valores: EntityID del IdP, URL de SSO del IdP y certificado.

Determinación del usuario

ElementoComportamiento
Criterio para enviar a SSOCuando la parte del correo que sigue a @ coincide exactamente con una entrada de la lista de dominios de correo (sin distinguir mayúsculas). Los subdominios se registran por separado.
Búsqueda de la cuentaSe busca la cuenta de Keural con el correo (en minúsculas) que envía el IdP.
Si no existe la cuentaSi Crear usuarios automáticamente en el primer inicio de sesión (JIT) está activado, se crea; si está desactivado, se rechaza el inicio de sesión.
Incorporación a la organizaciónSi no es miembro de la organización, se incorpora como miembro. Si los puestos están completos o la cuenta pertenece a otra organización, no se incorpora y solo se permite el inicio de sesión.
Condición para guardar el dominio de correoDominio verificado mediante TXT en DNS, excepto los dominios de correo públicos

Verificación de dominio

ElementoValor
Tipo de registroTXT
HostEl dominio registrado tal cual (por ejemplo, acme.com). No use subdominios de prefijo.
Valorkeural-verify=<UUID>, exactamente como aparece en la pantalla
Momento de comprobaciónSe consulta una vez al hacer clic en Confirmar verificación.

SCIM 2.0

ElementoValor
URL base{API}/scim/v2
AutenticaciónAuthorization: Bearer <token SCIM>. El token empieza por scim_ y solo se muestra una vez, al emitirlo.
Content-TypeSolicitud application/scim+json o application/json; respuesta application/scim+json
Códigos de estadoSe devuelven los códigos HTTP reales. El cuerpo del error tiene el formato SCIM Error (schemas, status, detail, scimType).

Endpoints

MétodoRutaComportamiento
GET/UsersLista. filter=userName eq "…", startIndex (predeterminado 1), count (predeterminado 100, máximo 200)
GET/Users/{id}Consulta de un usuario
POST/UsersCreación (201). Si ya existe el mismo correo, devuelve 409.
PATCH/Users/{id}Modifica active, displayName, name.formatted y name.givenName
PUT/Users/{id}Aplica displayName, name y active. Si omite active, se considera activo.
DELETE/Users/{id}Suspende la cuenta (204). No borra los datos.
GET/Groups, /Groups/{id}Consulta de los dos grupos fijos. filter=displayName eq "…"
PATCH/Groups/{id}Añade, quita o reemplaza miembros
GET/ServiceProviderConfig, /ResourceTypes, /SchemasConsulta de las funciones admitidas

Atributos de usuario

AtributoUso
userNameCorreo. Si no existe, se usa emails[0].value.
displayName · name.formatted · name.givenName+name.familyNameNombre para mostrar
activefalse suspende la cuenta (bloquea el inicio de sesión); true la restaura
idID de usuario de Keural. Se incluye en la respuesta.

No se guarda externalId. Para buscar un usuario desde el IdP, use el filtro userName.

Grupos

iddisplayNameSi se añade un miembroSi se quita un miembro
keural-adminsKeural AdminsAdministradorMiembro
keural-membersKeural MembersMiembroSin cambios

El rol del propietario de la organización no cambia mediante SCIM. La creación y eliminación de grupos (POST·DELETE /Groups) devuelve 501. El value de un miembro del grupo es el ID de usuario de Keural (id de /Users).

Alcance de la compatibilidad

FunciónCompatible
PATCHSí
FiltrosuserName eq, displayName eq
Bulk · ordenación · ETag · cambio de contraseñaNo

Errores

EstadoscimTypeCausa
400invalidValueFaltan userName y emails
401—El token falta o es incorrecto, o el aprovisionamiento SCIM está desactivado
404—El usuario o el grupo no pertenece a esta organización
409uniquenessYa existe una cuenta con el mismo correo, o se superó el número de puestos
501—Creación o eliminación de grupos

En esta página