Obexal Docs

Docs/Référence/Référence SCIM

Référence SCIM

L'API SCIM 2.0 entrante : opérations sur /scim/v2/Users, attributs supportés, filtres, codes de réponse et limites honnêtes.

Obexal expose un fournisseur SCIM 2.0 (RFC 7643/7644) pour que votre IdP d'entreprise (Okta, Entra ID, ou tout client SCIM) provisionne et déprovisionne les utilisateurs. Pour la mise en place guidée, voir SCIM entrant ; cette page est la référence au niveau du protocole.

URL de base et authentification

L'URL de base est https://accounts.obexal.com/scim/v2 (un domaine personnalisé remplace l'hôte). Chaque requête, y compris ServiceProviderConfig, exige un jeton SCIM, un secret bearer propre au tenant, généré dans la console ou via POST /v1/admin/scim/tokens :

curl https://accounts.obexal.com/scim/v2/Users \
  -H "Authorization: Bearer $SCIM_TOKEN"

Aucun cookie, aucun CSRF ; toutes les opérations sont scopées au tenant du jeton. Les réponses utilisent Content-Type: application/scim+json.

Opérations supportées

Seule la ressource Users existe :

MéthodeCheminEffet
GET/scim/v2/ServiceProviderConfigDocument de capacités (patch supporté, bulk non, filtre plafonné à 200)
GET/scim/v2/UsersListe les utilisateurs, avec filtre optionnel (?filter=, ?count=)
POST/scim/v2/UsersProvisionne un utilisateur (userName requis)
GET/scim/v2/Users/{id}Lit un utilisateur
PUT/scim/v2/Users/{id}Remplacement : applique active et les champs de profil du corps
PATCH/scim/v2/Users/{id}Mise à jour partielle : active et champs de profil, dans les deux styles de PatchOp (avec path ou avec un objet partiel)
DELETE/scim/v2/Users/{id}Désactive (renvoie 204)

Le déprovisionnement est une désactivation douce, jamais une suppression : DELETE et active: false passent le compte en deactivated, les sessions existantes sont terminées et la connexion est refusée. Les utilisateurs créés par SCIM arrivent avec un e-mail vérifié (l'IdP d'entreprise se porte garant de l'identité) et sans mot de passe : ils se connectent par SSO, passkey ou flux de réinitialisation. Aucun mot de passe n'est jamais provisionné.

curl -X POST https://accounts.obexal.com/scim/v2/Users \
  -H "Authorization: Bearer $SCIM_TOKEN" \
  -H "Content-Type: application/scim+json" \
  -d '{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
    "userName": "alice@example.eu",
    "externalId": "00u1abcd",
    "name": {"givenName": "Alice", "familyName": "Martin"},
    "title": "CTO",
    "active": true
  }'
# 201 -> la ressource créée, avec "id" et "meta.location"

Correspondance des attributs

Attribut SCIMChamp ObexalNotes
userNameE-mail (identifiant de connexion)Fixé à la création ; non modifiable via SCIM
externalIdIdentifiant de correspondance externeUnique par tenant ; sert à la réconciliation
activeStatut du comptetrue = actif, false = désactivé
name.givenNamePrénom
name.familyNameNom
name.formattedNom d'affichage (repli)Utilisé seulement si displayName est absent
displayNameNom d'affichage
titlePoste
localeLangue de l'interface
urn:ietf:params:scim:schemas:extension:enterprise:2.0:User departmentDépartementExtension entreprise ; son URN de schéma figure dans schemas quand le champ est présent
emailsDérivé de userNameLecture seule, une seule entrée primaire
meta.created, meta.lastModifiedHorodatagesRFC 3339

Filtres et pagination

Exactement deux filtres sont reconnus, sous la forme attribut eq "valeur" (noms d'attributs insensibles à la casse) :

GET /scim/v2/Users?filter=userName eq "alice@example.eu"
GET /scim/v2/Users?filter=externalId eq "00u1abcd"

Chacun renvoie zéro ou un résultat. Toute autre expression de filtre est ignorée et la requête retombe sur la liste simple. ?count= vaut 200 par défaut et est plafonné à 200 ; startIndex n'est pas honoré (les réponses indiquent toujours startIndex: 1, et totalResults égale le nombre de ressources renvoyées).

Codes de réponse

StatutSignification
200Lecture ou mise à jour réussie
201Utilisateur créé
204Utilisateur désactivé (DELETE)
400JSON invalide ou userName manquant
401Jeton SCIM absent, inconnu ou révoqué
404Utilisateur introuvable dans ce tenant
409userName ou externalId existe déjà dans le tenant
500Erreur interne

Les erreurs utilisent le corps d'erreur SCIM standard :

{"schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"], "status": "409", "detail": "utilisateur déjà existant"}

Ce qui n'est pas implémenté

  • Pas de ressources /Groups, /Bulk, /Schemas, /ResourceTypes ni /Me. L'appartenance aux groupes se gère dans la console ou via l'API d'administration : voir Groupes et accès aux apps.
  • Pas de tri, pas d'ETags, pas de synchronisation de mot de passe (sort, etag et changePassword sont annoncés non supportés dans ServiceProviderConfig).
  • Pas de renommage du userName ni de changement d'e-mail via SCIM.
  • Pas de pagination startIndex ; les pages de liste sont plafonnées à 200 ressources.

SCIM sortant

Obexal est aussi un client SCIM : il peut pousser le cycle de vie des utilisateurs (création, mise à jour, désactivation) vers les applications en aval qui exposent leur propre endpoint SCIM. Les cibles se configurent par application sous /v1/admin/scim-targets, avec synchronisation par cible. Voir SCIM sortant.