SCIM automatise le cycle de vie des comptes utilisateurs. Quand un collaborateur arrive, son compte est créé automatiquement dans toutes les applications. Quand il part, tous ses accès sont désactivés en quelques secondes — pas en quelques jours. Sans SCIM, vous gérez manuellement les comptes dans chaque application, avec les risques de sécurité et d’erreurs que cela implique.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »Ce guide vous explique SCIM — le standard pour synchroniser automatiquement les identités entre l’IdP et les applications. À la fin, vous saurez :
- Comprendre pourquoi SCIM est nécessaire (et ses alternatives)
- Maîtriser les opérations SCIM : création, modification, désactivation
- Configurer un offboarding propre (désactiver + révoquer)
- Anticiper les pièges courants d’implémentation
Prérequis : avoir lu Les bases de l’IAM.
Le problème : les comptes orphelins
Section intitulée « Le problème : les comptes orphelins »Sans provisioning automatique, voici ce qui se passe :
- Un employé arrive → création manuelle du compte dans chaque application
- L’employé change de service → modification manuelle des groupes
- L’employé part → on oublie de désactiver certains comptes
Résultat : des comptes orphelins qui persistent pendant des mois, voire des années. Un risque de sécurité majeur.
Les approches de provisioning
Section intitulée « Les approches de provisioning »Just-in-Time (JIT) provisioning
Section intitulée « Just-in-Time (JIT) provisioning »Le compte est créé au premier login via SSO (OIDC/SAML).
Comment ça marche :
- L’utilisateur se connecte pour la première fois
- L’application reçoit l’assertion SAML ou l’ID Token
- L’application crée le compte à partir des attributs reçus
Avantages :
- Simple à mettre en place
- Pas de synchronisation à maintenir
Limites :
- Le compte n’existe qu’au premier login
- Pas de pré-configuration (groupes, permissions spécifiques)
- Pas de deprovisioning automatique
SCIM provisioning
Section intitulée « SCIM provisioning »L’IdP pousse les changements vers les applications en temps réel.
Comment ça marche :
- Un utilisateur est créé/modifié/désactivé dans l’IdP
- L’IdP envoie une requête SCIM à l’application
- L’application applique le changement
Avantages :
- Comptes pré-créés avant le premier login
- Synchronisation des groupes et attributs
- Deprovisioning automatique
Limites :
- L’application doit supporter SCIM
- Configuration plus complexe
SCIM : le protocole
Section intitulée « SCIM : le protocole »SCIM (System for Cross-domain Identity Management) est défini par deux RFC :
- RFC 7643 : Schéma SCIM (objets User, Group)
- RFC 7644 : Protocole SCIM (API REST)
Architecture SCIM
Section intitulée « Architecture SCIM »L’IdP agit comme SCIM Client (pousse les changements). L’application agit comme SCIM Server (reçoit et applique).
Les objets SCIM
Section intitulée « Les objets SCIM »{ "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"], "id": "2819c223-7f76-453a-919d-413861904646", "externalId": "alice.martin", "userName": "alice.martin@example.com", "name": { "givenName": "Alice", "familyName": "Martin" }, "emails": [ { "value": "alice.martin@example.com", "type": "work", "primary": true } ], "active": true, "groups": [ { "value": "developers", "display": "Developers Team" } ], "meta": { "resourceType": "User", "created": "2024-02-06T10:00:00Z", "lastModified": "2024-02-06T10:00:00Z" }}Attributs clés
Section intitulée « Attributs clés »| Attribut | Description |
|---|---|
id | Identifiant unique côté application |
externalId | Identifiant unique côté IdP |
userName | Identifiant de login (souvent l’email) |
active | Compte actif ou désactivé |
emails | Liste des adresses email |
groups | Groupes auxquels appartient l’utilisateur |
{ "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"], "id": "group-123", "displayName": "Developers Team", "members": [ { "value": "2819c223-7f76-453a-919d-413861904646", "display": "Alice Martin" } ]}Les opérations SCIM
Section intitulée « Les opérations SCIM »CRUD sur les utilisateurs
Section intitulée « CRUD sur les utilisateurs »| Opération | Méthode HTTP | Endpoint | Usage |
|---|---|---|---|
| Créer | POST | /Users | Nouvel employé |
| Lire | GET | /Users/{id} | Vérifier un compte |
| Lister | GET | /Users?filter=... | Rechercher des utilisateurs |
| Modifier | PUT | /Users/{id} | Remplacement complet |
| Modifier partiellement | PATCH | /Users/{id} | Modification ciblée |
| Supprimer | DELETE | /Users/{id} | Suppression (rare) |
Exemples de requêtes
Section intitulée « Exemples de requêtes »Créer un utilisateur :
POST /scim/v2/UsersContent-Type: application/scim+jsonAuthorization: Bearer <token>
{ "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"], "userName": "alice.martin@example.com", "name": { "givenName": "Alice", "familyName": "Martin" }, "emails": [{"value": "alice.martin@example.com", "primary": true}], "active": true}Désactiver un utilisateur (PATCH) :
PATCH /scim/v2/Users/2819c223-7f76-453a-919d-413861904646Content-Type: application/scim+json
{ "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "replace", "path": "active", "value": false } ]}Rechercher des utilisateurs :
GET /scim/v2/Users?filter=userName eq "alice.martin@example.com"Le cycle de vie complet
Section intitulée « Le cycle de vie complet »Onboarding (arrivée)
Section intitulée « Onboarding (arrivée) »-
Création dans l’IdP
Le RH crée l’utilisateur dans le système source (AD, Workday, HR system).
-
Synchronisation vers l’IdP
L’IdP central (Keycloak, Okta) reçoit l’utilisateur.
-
Provisioning SCIM
L’IdP pousse l’utilisateur vers les applications configurées.
-
Confirmation
Chaque application retourne un
idSCIM que l’IdP stocke pour les futures mises à jour.
Changement de poste (Mover)
Section intitulée « Changement de poste (Mover) »-
Modification des groupes dans l’IdP
L’utilisateur change d’équipe, ses groupes sont mis à jour.
-
PATCH SCIM vers les applications
L’IdP envoie les modifications de groupes.
-
Mise à jour des permissions
L’application ajuste les accès selon les nouveaux groupes.
Offboarding (départ)
Section intitulée « Offboarding (départ) »-
Désactivation dans l’IdP
Le compte est marqué
active: falsedans l’IdP. -
PATCH SCIM : désactiver
L’IdP envoie
{ "active": false }à toutes les applications. -
Révocation des tokens
Les applications invalident les sessions et tokens existants.
-
Blocage des logins
L’IdP refuse toute nouvelle authentification.
Offboarding propre
Section intitulée « Offboarding propre »Un offboarding “propre” doit garantir que :
- ✅ Le compte est désactivé (plus de nouveaux logins)
- ✅ Les sessions actives sont terminées
- ✅ Les tokens (access, refresh) sont révoqués
- ✅ Les accès API sont bloqués
- ✅ Les données sont conservées ou archivées selon la politique
Implémentation
Section intitulée « Implémentation »| Étape | Action IdP | Action Application |
|---|---|---|
| 1. Désactivation | active: false dans l’IdP | SCIM PATCH reçu |
| 2. Sessions | N/A | Invalider toutes les sessions du user |
| 3. Tokens | Révoquer les refresh tokens | Supprimer les tokens stockés |
| 4. Audit | Logger le deprovisioning | Logger la désactivation |
Gestion des données
Section intitulée « Gestion des données »| Option | Quand l’utiliser |
|---|---|
| Conserver | Conformité, historique, audit |
| Anonymiser | RGPD, données personnelles |
| Supprimer | Demande explicite, données non critiques |
Pièges courants
Section intitulée « Pièges courants »| Piège | Conséquence | Solution |
|---|---|---|
| L’app ne supporte pas SCIM | Provisioning manuel | Vérifier avant intégration |
externalId vs id confondus | Échec des mises à jour | externalId = IdP, id = application |
| DELETE au lieu de désactiver | Perte d’historique | Toujours préférer active: false |
| Pas de révocation des sessions | Accès persistant après départ | Implémenter la révocation côté app |
| Mapping d’attributs incorrect | Données manquantes | Tester le mapping en pre-prod |
Configuration Keycloak + SCIM
Section intitulée « Configuration Keycloak + SCIM »Keycloak ne supporte pas SCIM nativement, mais plusieurs extensions existent.
Avec l’extension scim-for-keycloak
Section intitulée « Avec l’extension scim-for-keycloak »-
Installer l’extension
Fenêtre de terminal # Ajouter le provider SCIM à Keycloakcp scim-for-keycloak.jar /opt/keycloak/providers//opt/keycloak/bin/kc.sh build -
Configurer le endpoint SCIM
Dans Keycloak Admin → Realm Settings → SCIM
-
Configurer l’application cliente
Entrer l’URL SCIM de l’application et le token d’authentification
-
Tester le provisioning
Créer un utilisateur dans Keycloak et vérifier sa création dans l’application
Okta / Azure AD
Section intitulée « Okta / Azure AD »Ces IdP supportent SCIM nativement :
- Ajouter l’application depuis le catalogue
- Activer le provisioning
- Entrer l’URL SCIM et le token de l’application
- Mapper les attributs
- Tester
SCIM vs autres approches
Section intitulée « SCIM vs autres approches »| Approche | Avantages | Inconvénients | Usage |
|---|---|---|---|
| SCIM | Standard, temps réel, deprovisioning | L’app doit le supporter | SaaS modernes |
| JIT (SSO) | Simple, pas de config | Pas de deprovisioning | Apps sans SCIM |
| LDAP sync | Robuste, mature | Plus complexe, polling | Apps on-prem |
| API custom | Flexible | Sur-mesure, maintenance | Legacy, cas spéciaux |
Erreurs fréquentes
Section intitulée « Erreurs fréquentes »| Erreur | Conséquence | Solution |
|---|---|---|
| Pas de test de deprovisioning | Comptes orphelins au premier départ | Tester le flow complet en pre-prod |
| Token SCIM en clair | Compromission possible | Stocker dans un vault |
| Pas de monitoring | Échecs silencieux | Alerter sur les erreurs SCIM |
| Mapping incomplet | Attributs manquants | Documenter et valider le mapping |