
# keenauth_directory

La ressource `keenauth_directory` crée un répertoire SCIM 2.0 pour une organisation. Un répertoire est le point de terminaison auquel le fournisseur d'identité de l'organisation (Okta, Entra ID et d'autres) provisionne les utilisateurs et les groupes.

```terraform
resource "keenauth_directory" "acme_okta" {
  organization_id = keenauth_organization.acme.id
  name            = "Okta"
  scim_host       = "acme.eu.keenauth.app"
}

output "scim_base_url" {
  value = keenauth_directory.acme_okta.base_url
}
```

`base_url` est `https://<scim_host>/scim/v2/<id>`. Transmettez-la au fournisseur d'identité avec un jeton SCIM.

## Modifications sur place et remplacements

`name` et les paramètres du répertoire sont modifiés sur place. Le provider envoie un JSON merge patch ne contenant que les champs modifiés, ainsi que l'ETag de la dernière lecture dans `If-Match` ; si le répertoire a été modifié en dehors de cette configuration après cette lecture, l'API répond `412`, rien n'est modifié, et vous devez relancer plan. L'API n'accepte aucun paramètre à la création d'un répertoire : les paramètres configurés sont donc appliqués juste après la création, dans le même apply.

La modification de `organization_id`, `scim_host` ou `type` remplace le répertoire.

- Un remplacement supprime d'abord l'ancien répertoire. La suppression d'un répertoire est immédiate et définitive : ses jetons, utilisateurs provisionnés, groupes, appartenances aux groupes et retenues de déprovisionnement en attente disparaissent avec lui, et les requêtes SCIM du fournisseur d'identité reçoivent `401`. Un nouveau répertoire a un nouvel ID et une nouvelle base URL ; le fournisseur d'identité doit être pointé vers lui avec un nouveau jeton.
- Protégez un répertoire que vous ne pouvez pas vous permettre de perdre avec `lifecycle { prevent_destroy = true }`.
- Un nouveau répertoire est `inactive`. Le provider ne l'active ni ne le désactive (`keenauth directories activate` et `deactivate` le font) ; `state` est en lecture seule.
- La suppression de l'organisation supprime ses répertoires. Un répertoire supprimé en dehors du provider est retiré du state, puis de nouveau planifié.

## Paramètres

```terraform
resource "keenauth_directory" "acme_okta" {
  organization_id = keenauth_organization.acme.id
  name            = "Okta"
  scim_host       = "acme.eu.keenauth.app"

  provisioning_mode   = "user_store"
  attribute_allowlist = ["title", "urn:ietf:params:scim:schemas:extension:enterprise:2.0:user:department"]
  delete_action       = "remove_membership"

  mass_deprovision_guard = {
    percent      = 20
    absolute_min = 50
  }
}
```

| Paramètre | Valeurs | Valeur par défaut |
|---|---|---|
| `provisioning_mode` | `user_store` (les utilisateurs de l'environnement, les appartenances aux organisations et les rôles de groupe sont écrits) ou `mirror` (seuls les enregistrements du répertoire sont conservés) | `user_store` |
| `attribute_allowlist` | Jusqu'à 40 attributs SCIM facultatifs conservés sur les utilisateurs du répertoire : `title`, `usertype`, `phonenumbers` et les clés de l'extension entreprise | vide |
| `unverified_domain_action` | `invite` ou `mirror_only`, pour un utilisateur dont le domaine d'e-mail n'est pas vérifié pour l'organisation | `invite` |
| `delete_action` | `remove_membership` ou `delete_user`, pour un `DELETE /Users` SCIM | `remove_membership` |
| `on_delete_memberships` | `keep`, `suspend` ou `remove`, pour les appartenances issues du répertoire lorsqu'il est supprimé | `keep` |
| `mass_deprovision_guard` | `enabled`, `percent` (5 à 50) et `absolute_min` (10 à 1000) ; les déprovisionnements dépassant les deux seuils dans un délai de 5 minutes sont retenus pour approbation | activé, 10, 25 |
| `send_welcome_email` | `true` ou `false` : un e-mail d'activation de compte pour les nouveaux utilisateurs du répertoire | `false` |

- Un paramètre que vous ne configurez pas conserve la valeur du serveur, et la suppression d'un paramètre de la configuration conserve sa dernière valeur. Dans `mass_deprovision_guard`, un champ que vous ne renseignez pas conserve sa valeur.
- La suppression d'une clé de `attribute_allowlist` supprime cet attribut de chaque enregistrement utilisateur du répertoire, dans la même mise à jour. Un ensemble vide (`[]`) vide la liste.
- `provisioning_mode` ne peut pas changer tant que le répertoire contient des enregistrements utilisateur ; l'API répond `409`.

## Jetons SCIM

Le jeton SCIM est un secret. L'API le renvoie une seule fois, dans la réponse qui crée le répertoire, et aucun point de terminaison ne peut le lire ensuite. Le provider ne l'écrit jamais dans le state, un fichier de plan, une sortie ou un journal. Pour préserver cette garantie, et pour qu'aucun identifiant valide ne reste inconnu de tous, le provider révoque immédiatement le jeton renvoyé lors de la création.

Créez le jeton de votre fournisseur d'identité avec [`keenauth_directory_token`](/docs/terraform/directory-token). Il conserve le jeton dans le state, chiffré uniquement avec votre clé publique RSA, que vous déchiffrez avec votre clé privée.

Si le provider ne peut pas révoquer le jeton initial, l'apply réussit tout de même et affiche un avertissement contenant la commande qui le révoque (`keenauth directories tokens delete <directory_id> <token_id>`).

## Arguments

- `scim_host` est l'hôte principal de l'environnement : son domaine personnalisé actif, sinon `<slug>.<region>.keenauth.app`. Il doit s'agir d'un nom DNS en minuscules qui route vers cet environnement, sans quoi l'API répond `422`. L'API ne vérifie pas qu'il s'agit de l'hôte principal, donc un domaine personnalisé secondaire est accepté.
- `name` comprend de 1 à 64 caractères, sans caractères de contrôle et sans espaces en début ou en fin. Il n'est pas nécessaire qu'il soit unique.
- `type` vaut `scim` et ne peut prendre aucune autre valeur dans GA-1.
- `state`, `base_url`, `created_at`, `etag` et `id` sont en lecture seule. L'API ne renvoie pas `scim_host` ; le provider le déduit donc de l'hôte de `base_url`.

## Import

Importez par ID de répertoire :

```shell
tofu import keenauth_directory.acme_okta dir_01j9zq3v8c5m2x7k4t6r1n0b3d
```
