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éthode | Chemin | Effet |
|---|---|---|
| GET | /scim/v2/ServiceProviderConfig | Document de capacités (patch supporté, bulk non, filtre plafonné à 200) |
| GET | /scim/v2/Users | Liste les utilisateurs, avec filtre optionnel (?filter=, ?count=) |
| POST | /scim/v2/Users | Provisionne 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 SCIM | Champ Obexal | Notes |
|---|---|---|
userName | E-mail (identifiant de connexion) | Fixé à la création ; non modifiable via SCIM |
externalId | Identifiant de correspondance externe | Unique par tenant ; sert à la réconciliation |
active | Statut du compte | true = actif, false = désactivé |
name.givenName | Prénom | |
name.familyName | Nom | |
name.formatted | Nom d'affichage (repli) | Utilisé seulement si displayName est absent |
displayName | Nom d'affichage | |
title | Poste | |
locale | Langue de l'interface | |
urn:ietf:params:scim:schemas:extension:enterprise:2.0:User department | Département | Extension entreprise ; son URN de schéma figure dans schemas quand le champ est présent |
emails | Dérivé de userName | Lecture seule, une seule entrée primaire |
meta.created, meta.lastModified | Horodatages | RFC 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
| Statut | Signification |
|---|---|
| 200 | Lecture ou mise à jour réussie |
| 201 | Utilisateur créé |
| 204 | Utilisateur désactivé (DELETE) |
| 400 | JSON invalide ou userName manquant |
| 401 | Jeton SCIM absent, inconnu ou révoqué |
| 404 | Utilisateur introuvable dans ce tenant |
| 409 | userName ou externalId existe déjà dans le tenant |
| 500 | Erreur 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,/ResourceTypesni/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,etagetchangePasswordsont annoncés non supportés dansServiceProviderConfig). - Pas de renommage du
userNameni 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.