Aller au contenu
KeuralDocs
Développeurs

Spécification d'intégration SSO et SCIM

Valeurs et comportement de l'intégration OIDC, SAML 2.0 et SCIM 2.0 utiles au responsable IdP et aux développeurs.

Pour l'ordre de configuration à l'écran, voir SSO et SCIM.

Dans le tableau ci-dessous, {API} est l'adresse de l'API Keural de l'environnement que vous utilisez (par exemple, https://api.keural.ai). Pour obtenir la valeur exacte, copiez l'adresse affichée dans Gestion de l'organisation → Paramètres SSO.

Récapitulatif des valeurs d'enregistrement

ÉlémentValeur
URI de redirection OIDC{API}/api/sso/callback
Démarrage de la connexion OIDC·SAML{API}/api/sso/{orgId}/login
EntityID du SP SAML{API}/api/sso/saml/metadata
URL ACS SAML{API}/api/sso/saml/callback
URL de base SCIM{API}/scim/v2

La connexion démarre toujours depuis Keural (SP-initiated). Si vous saisissez sur l'écran de connexion une adresse e-mail d'un domaine enregistré, vous êtes redirigé vers l'adresse de démarrage de la connexion. En cas de réussite, vous arrivez sur l'écran d'accueil de Keural ; en cas d'échec, vous êtes redirigé vers /login?error=sso.

OIDC

ÉlémentComportement
FluxAuthorization Code
Requête authorizeresponse_type=code, client_id, redirect_uri, scope=openid email profile, state, nonce
state · nonceÀ usage unique et valables 10 minutes. Si la fenêtre de connexion reste ouverte plus de 10 minutes, il faut recommencer la connexion depuis le début.
Échange de jetonPOST vers le token endpoint, application/x-www-form-urlencoded. L'authentification du client est client_secret_post (client_id et client_secret dans le corps).
Signature de l'ID tokenSeul RS256 est accepté. La clé est recherchée dans jwks_uri à l'aide du kid.
Vérification de l'ID tokenSignature, exp, aud contenant le client_id, nonce identique, et iss égal à l'Issuer URL (la / finale est ignorée).
E-mailLa revendication email de l'ID token. Si elle est absente, le userinfo endpoint est interrogé avec Authorization: Bearer <access_token> et email y est lu.
NomLa revendication name de l'ID token
EndpointsRecherchés dans /.well-known/openid-configuration de l'Issuer URL. Si l'IdP ne les trouve pas, saisissez manuellement les adresses authorization, token, JWKS et userinfo dans Ouvrir les paramètres avancés.
Délai15 secondes par appel à l'IdP

L'application IdP doit autoriser client_secret_post. Si la configuration n'autorise que client_secret_basic ou private_key_jwt, l'échange de jeton échoue.

SAML 2.0

ÉlémentComportement
RequêteEnvoie un AuthnRequest via le binding HTTP-Redirect. La requête n'est pas signée.
Contenu de la requêteDestination=URL SSO de l'IdP, AssertionConsumerServiceURL=URL ACS, ProtocolBinding=HTTP-POST, Issuer=EntityID du SP, NameIDPolicy Format=…:nameid-format:unspecified, AllowCreate=true
RéponseBinding HTTP-POST avec SAMLResponse et RelayState. Le RelayState doit être renvoyé exactement tel que Keural l'a envoyé.
SignatureLa Response ou l'Assertion doit porter une signature valide. La clé de vérification est uniquement le certificat enregistré à l'écran.
AssertionLa réponse doit contenir exactement une assertion. Les assertions chiffrées (EncryptedAssertion) ne sont pas acceptées.
StatutStatusCode égal à urn:oasis:names:tc:SAML:2.0:status:Success
IssuerSi vous avez saisi l'EntityID de l'IdP, il doit correspondre à l'Issuer de l'assertion
ConditionsNotBefore et NotOnOrAfter (tolérance de 300 secondes), Audience=EntityID du SP
SubjectConfirmationDataRecipient=URL ACS, NotOnOrAfter (tolérance de 300 secondes), InResponseTo=ID de la requête envoyée par Keural
E-mailUn attribut dont Name ou FriendlyName est l'une des valeurs suivantes (sans tenir compte de la casse) : email, mail, emailAddress, E-Mail-Addresses, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress. Sinon, le NameID contenant @ est utilisé.
NomdisplayName, name, cn, http://schemas.microsoft.com/identity/claims/displayname
CertificatUn certificat X.509. Au format PEM ou Base64 (DER). Pour le remplacer, saisissez le nouveau certificat et enregistrez.
MétadonnéesAu lieu d'importer le XML de métadonnées de l'IdP, saisissez trois valeurs : EntityID de l'IdP, URL SSO de l'IdP et certificat.

Détermination de l'utilisateur

ÉlémentComportement
Critère d'orientation vers le SSOLorsque la partie de l'e-mail qui suit @ est exactement identique à une entrée de la liste des domaines e-mail (sans tenir compte de la casse). Les sous-domaines s'enregistrent séparément.
Recherche du compteRecherche du compte Keural à partir de l'e-mail (en minuscules) fourni par l'IdP.
Si le compte n'existe pasSi Créer automatiquement les utilisateurs lors de la première connexion (JIT) est activé, le compte est créé ; s'il est désactivé, la connexion est refusée.
Rattachement à l'organisationSi la personne n'est pas membre de l'organisation, elle y entre en tant que membre. Si les sièges sont pleins ou si le compte appartient à une autre organisation, elle n'y entre pas et la connexion seule est autorisée.
Condition d'enregistrement du domaine e-mailDomaine vérifié par enregistrement TXT DNS, à l'exception des domaines e-mail publics

Vérification du domaine

ÉlémentValeur
Type d'enregistrementTXT
HôteLe domaine enregistré tel quel (par exemple, acme.com). N'utilisez pas de sous-domaine préfixé.
Valeurkeural-verify=<UUID>, exactement comme affichée à l'écran
Moment de la vérificationInterrogé une fois, au clic sur Confirmer la vérification.

SCIM 2.0

ÉlémentValeur
URL de base{API}/scim/v2
AuthentificationAuthorization: Bearer <jeton SCIM>. Le jeton commence par scim_ et n'est affiché qu'une seule fois, au moment de son émission.
Content-TypeRequête application/scim+json ou application/json ; réponse application/scim+json
Codes d'étatLes codes HTTP réels sont renvoyés. Le corps d'erreur suit le format SCIM Error (schemas, status, detail, scimType).

Endpoints

MéthodeCheminComportement
GET/UsersListe. filter=userName eq "…", startIndex (par défaut 1), count (par défaut 100, maximum 200)
GET/Users/{id}Consultation d'un utilisateur
POST/UsersCréation (201). Si l'e-mail existe déjà, renvoie 409.
PATCH/Users/{id}Modifie active, displayName, name.formatted et name.givenName
PUT/Users/{id}Applique displayName, name et active. Si active est omis, l'utilisateur est considéré comme actif.
DELETE/Users/{id}Suspend le compte (204). Les données ne sont pas supprimées.
GET/Groups, /Groups/{id}Consultation des deux groupes fixes. filter=displayName eq "…"
PATCH/Groups/{id}Ajoute, retire ou remplace des membres
GET/ServiceProviderConfig, /ResourceTypes, /SchemasConsultation des fonctions prises en charge

Attributs utilisateur

AttributUsage
userNameE-mail. S'il est absent, emails[0].value est utilisé.
displayName · name.formatted · name.givenName+name.familyNameNom affiché
activefalse suspend (bloque la connexion) ; true rétablit
idID utilisateur Keural. Il figure dans la réponse.

externalId n'est pas stocké. Pour retrouver un utilisateur depuis l'IdP, utilisez le filtre userName.

Groupes

iddisplayNameAjout d'un membreRetrait d'un membre
keural-adminsKeural AdminsAdministrateurMembre
keural-membersKeural MembersMembreAucun changement

Le rôle du propriétaire de l'organisation n'est pas modifié par SCIM. La création et la suppression de groupes (POST·DELETE /Groups) renvoient 501. La value d'un membre de groupe est l'ID utilisateur Keural (id de /Users).

Périmètre de prise en charge

FonctionPrise en charge
PATCHOui
FiltresuserName eq, displayName eq
Bulk · tri · ETag · changement de mot de passeNon

Erreurs

StatutscimTypeCause
400invalidValueuserName et emails absents
401—Jeton absent ou incorrect, ou provisionnement SCIM désactivé
404—L'utilisateur ou le groupe n'appartient pas à cette organisation
409uniquenessUn compte avec le même e-mail existe déjà, ou le nombre de sièges est dépassé
501—Création ou suppression de groupes

Sur cette page