> ## Documentation Index
> Fetch the complete documentation index at: https://docs.lighton.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Paradigm peut-il provisionner automatiquement les utilisateurs ?

> Cet article explique comment Paradigm implémente le protocole SCIM (System for Cross-domain Identity Management) pour permettre le provisioning et la gestion transparente des utilisateurs entre systèmes.

Cet article explique comment Paradigm implémente le protocole SCIM (System for Cross-domain Identity Management) pour permettre le provisioning et la gestion transparente des utilisateurs entre systèmes.

## Qu'est-ce que SCIM ?

SCIM (System for Cross-domain Identity Management) est une norme ouverte qui simplifie la gestion des utilisateurs dans des scénarios multi-domaines. Elle fournit un schéma standardisé et une API pour créer, lire, mettre à jour et supprimer les données d'identité entre les fournisseurs d'identité et les fournisseurs de services.

<Warning>
  Veuillez noter que les modifications sur les utilisateurs sont toujours possibles depuis le panneau d'administration Paradigm même si vous avez le provisioning d'utilisateurs avec SCIM activé pour votre entreprise.
</Warning>

## Détails de l'Implémentation SCIM

### Version SCIM Prise en Charge

Paradigm prend en charge SCIM 2.0 ([RFC 7642](https://datatracker.ietf.org/doc/html/rfc7642), [RFC 7643](https://datatracker.ietf.org/doc/html/rfc7643) et [RFC 7644](https://datatracker.ietf.org/doc/html/rfc7644)).

### Fournisseurs d'Identité Testés

Notre implémentation SCIM a été testée avec :

* Microsoft Entra ID

### URL de Base

Tous les endpoints SCIM sont accessibles via :

```
https://[paradigm-domain]/scim/v2/
```

Avec `[paradigm-domain]` étant le nom de domaine sous lequel Paradigm est hébergé. Pour la plateforme Saas de LightOn, sa valeur serait `https://paradigm.lighton.ai/scim/v2/`.

### Authentification

Pour sécuriser l'API SCIM, nous avons implémenté une authentification basée sur des jetons utilisant notre backend d'authentification de clé API.

Chaque requête doit inclure un en-tête d'autorisation :

```
Authorization: Bearer {your-paradigm-api-key}
```

Vous pouvez générer et gérer les clés API dans le Panneau d'Administration sous Paramètres API.

<Warning>
  Une clé API Paradigm ne peut être utilisée que pour gérer les utilisateurs faisant partie de la même entreprise que le propriétaire de la clé API, quel que soit le rôle de l'utilisateur.
</Warning>

### Endpoints Pris en Charge

Voici les endpoints SCIM pris en charge par Paradigm avec leurs méthodes HTTP :

| Endpoint      | Méthode HTTP | Description                                            |
| ------------- | ------------ | ------------------------------------------------------ |
| `/Users`      | GET          | Lister/rechercher des utilisateurs                     |
| `/Users`      | POST         | Créer un utilisateur                                   |
| `/Users/{id}` | GET          | Obtenir un utilisateur spécifique                      |
| `/Users/{id}` | PUT          | Remplacer les attributs d'un utilisateur               |
| `/Users/{id}` | PATCH        | Mettre à jour les attributs d'un utilisateur           |
| `/Users/{id}` | DELETE       | Supprimer un utilisateur (Anonymisation pour Paradigm) |
| `/Groups`     | GET          | Lister/rechercher des groupes                          |

<Note>
  Il n'est actuellement pas possible de gérer les groupes via l'endpoint `/Groups`.
</Note>

### Attributs SCIM Utilisateur Pris en Charge

L'implémentation SCIM de Paradigm prend en charge les attributs utilisateur suivants :

**Attributs Principaux**

| Attribut            | Description                                                                                                                                                                                                                               | Requis |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ |
| `userName`          | Identifiant unique pour l'utilisateur                                                                                                                                                                                                     | Oui    |
| `name.givenName`    | Prénom                                                                                                                                                                                                                                    | Non    |
| `name.familyName`   | Nom de famille                                                                                                                                                                                                                            | Non    |
| `title`             | Titre de l'utilisateur, comme "Vice Président"                                                                                                                                                                                            | Non    |
| `preferredLanguage` | Indique la langue écrite ou parlée préférée de l'utilisateur                                                                                                                                                                              | Non    |
| `active`            | Booléen indiquant si l'utilisateur est actif                                                                                                                                                                                              | Non    |
| `emails`            | Adresses e-mail, Paradigm ne prend en charge qu'une seule adresse e-mail par utilisateur                                                                                                                                                  | Oui    |
| `password`          | Mot de passe en texte clair de l'utilisateur. Cet attribut est destiné à être utilisé pour spécifier un mot de passe initial lors de la création d'un nouvel utilisateur ou pour réinitialiser le mot de passe d'un utilisateur existant. | Non    |

### Schéma de Groupe

L'implémentation SCIM de Paradigm prend en charge les attributs de groupe suivants :

| Attribut      | Description                     | Requis |
| ------------- | ------------------------------- | ------ |
| `displayName` | Nom du groupe                   | Oui    |
| `members`     | Liste des références de membres | Non    |

### Gestion des Erreurs

Les endpoints de l'API SCIM Paradigm retournent des codes HTTP standard [suivant le format d'erreur SCIM](https://datatracker.ietf.org/doc/html/rfc7644#section-3.7.3) :

| Code de Statut | Description                              |
| -------------- | ---------------------------------------- |
| 200            | Opération réussie                        |
| 201            | Ressource créée avec succès              |
| 400            | Mauvaise requête (erreur de validation)  |
| 401            | Non autorisé (erreur d'authentification) |
| 403            | Interdit (erreur d'autorisation)         |
| 404            | Ressource non trouvée                    |
| 409            | Conflit avec une ressource existante     |
| 500            | Erreur interne du serveur                |

Voici un exemple de réponse d'erreur :

```json theme={null}
{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"], 
    "status": "400", 
    "detail": "Attribute 'userName' is required" 
}
```

## Flux de Provisioning

### Provisioning d'Utilisateur

1. Le Fournisseur d'Identité (IdP) initie une requête SCIM pour créer un utilisateur sur l'endpoint `/Users`
2. Paradigm valide la requête et les données utilisateur
3. Un nouveau compte utilisateur est créé avec les permissions par défaut
4. Une réponse de succès est retournée à l'IdP

### Dé-provisioning d'Utilisateur

1. Le Fournisseur d'Identité (IdP) envoie une requête pour désactiver ou supprimer un utilisateur
2. Paradigm valide la requête
3. **Pour la désactivation** : Le statut `active` de l'utilisateur est défini sur `false`
4. **Pour la suppression** : Le compte utilisateur est anonymisé (Toutes les données utilisateur sont supprimées mais les données comportementales sont conservées)
5. Une réponse de succès est retournée à l'IdP

Toute requête SCIM ultérieure sur l'utilisateur anonymisé retournera une réponse HTTP `404 Not Found`.

## Exemples de requête/réponse API

### Création d'Utilisateur

Exemple de données de requête :

```http theme={null}
POST /scim/v2/Users
Authorization: Bearer {your-paradigm-api-key}
Content-Type: application/json

{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:User"
  ],
  "userName": "john.doe@example.com",
  "externalId": "ccb1c352-d321-4027-9d17-de03d8d28b2f",
  "name": {
    "givenName": "John",
    "familyName": "Doe"
  },
  "emails": [
    {
      "value": "john.doe@example.com",
      "primary": true
    }
  ],
  "password": "fake-password-value",
  "title": "Software Engineer",
  "preferredLanguage": "fr-Latn-CA"
}
```

Réponse associée :

```json theme={null}
{
    'schemas': ['urn:ietf:params:scim:schemas:core:2.0:User'],
    'id': '4', 
    'externalId': 'ccb1c352-d321-4027-9d17-de03d8d28b2f',
    'userName': 'john.doe@example.com', 
    'name': {
        'givenName': 'John', 
        'familyName': 'Doe', 
        'formatted': 'John Doe'
    }, 
    'displayName': 'John Doe', 
    'emails': [
        {
            'value': 'john.doe@example.com', 
            'primary': True
        }
    ], 
    'active': True, 
    'title': 'Software Engineer', 
    'preferredLanguage': 'fr',
    'groups': [],
    'meta': {
        'resourceType': 'User', 
        'created': '2025-04-18T08:43:17.679804+00:00', 
        'lastModified': '2025-04-18T08:43:17.679804+00:00', 
        'location': 'http://testserver/scim/v2/Users/4'
    }
}
```

### Mise à Jour d'un Utilisateur

Exemple de données de requête :

```http theme={null}
PATCH /scim/v2/Users/a1b2c3d4
Authorization: Bearer {your-paradigm-api-key}
Content-Type: application/json

{
  "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
  "Operations": [
    {
      "op": "replace",
      "path": "name.givenName",
      "value": "Jonathan"
    },
    {
      "op": "replace",
      "path": "title",
      "value": "Senior Software Engineer"
    }
  ]
}
```

## Dépannage

### Échecs d'Authentification

* Vérifiez que votre clé API est valide et n'a pas expiré
* Vérifiez que le propriétaire de la clé API a les permissions pour gérer les utilisateurs
* Assurez-vous que l'en-tête Authorization est correctement formaté

## Bonnes Pratiques

1. **Implémenter des Mises à Jour Incrémentales** : Utilisez les opérations PATCH au lieu de PUT quand c'est possible
2. **Gérer les Échecs d'API avec Élégance** : Implémentez une logique de retry avec backoff exponentiel
3. **Maintenir la Synchronisation IdP** : Planifiez des synchronisations complètes régulières pour assurer la cohérence
4. **Sécuriser Vos Clés API** : Effectuez une rotation régulière des jetons et stockez-les de manière sécurisée
