
# keenauth_directory_token

La ressource `keenauth_directory_token` crée un jeton porteur SCIM d'un annuaire pour le fournisseur d'identité qui y provisionne les utilisateurs et les groupes. Le fournisseur ne conserve le jeton dans l'état que chiffré avec une clé publique RSA que vous lui donnez.

```terraform
resource "keenauth_directory_token" "okta" {
  directory_id    = keenauth_directory.acme_okta.id
  label           = "Okta"
  expires_in_days = 180
  public_key      = file("${path.module}/scim-token-key.pub.pem")

  lifecycle {
    create_before_destroy = true
  }
}

output "okta_scim_token_encrypted" {
  value = keenauth_directory_token.okta.encrypted_token
}
```

## Le jeton n'est jamais stocké en clair

L'API renvoie un jeton SCIM une seule fois, dans la réponse qui le crée, et aucun point de terminaison ne permet de le relire ensuite. Le fournisseur chiffre le jeton avec votre clé publique (RSA-OAEP avec SHA-256, MGF1 SHA-256 et une étiquette vide) et n'écrit dans `encrypted_token` que le texte chiffré en base64. Le jeton en clair n'atteint jamais l'état, un fichier de plan, une sortie ou un journal. Seul le détenteur de la clé privée peut le déchiffrer ; ainsi, un fichier d'état qui fuit ne divulgue pas le jeton.

Créez la paire de clés une seule fois, en dehors d'OpenTofu, et gardez la clé privée hors de votre configuration :

```shell
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out scim-token-key.pem
openssl pkey -in scim-token-key.pem -pubout -out scim-token-key.pub.pem
```

Après `tofu apply`, déchiffrez le jeton et donnez-le au fournisseur d'identité :

```shell
tofu output -raw okta_scim_token_encrypted | base64 -d | \
  openssl pkeyutl -decrypt -inkey scim-token-key.pem \
    -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pkeyopt rsa_mgf1_md:sha256
```

`public_key` doit être une clé publique RSA au format PEM (`PUBLIC KEY` ou `RSA PUBLIC KEY`) d'au moins 2048 bits. Une clé privée ou une clé plus petite est rejetée au moment du plan. Si le fournisseur ne peut pas livrer de jeton, il révoque aussitôt le jeton et l'apply échoue ; ainsi, il n'existe aucun jeton valide que personne ne détient.

## Création et révocation uniquement

Un jeton ne peut pas être modifié. Chaque argument (`directory_id`, `label`, `expires_in_days`, `public_key`) crée un nouveau jeton lorsque vous le modifiez, et l'ancien jeton est révoqué. Détruire la ressource révoque le jeton.

Un jeton révoqué en dehors du fournisseur, ou expiré, est retiré de l'état au prochain rafraîchissement, et le prochain apply en crée un nouveau. Supprimer l'annuaire supprime ses jetons.

## Rotation

Un annuaire a au plus 2 jetons valides ; un troisième est rejeté avec `409`. Cela suffit pour effectuer une rotation sans interruption : avec `create_before_destroy = true`, le nouveau jeton est créé avant que l'ancien ne soit révoqué. Donnez le nouveau jeton au fournisseur d'identité dans la même fenêtre de changement.

## Arguments

- `label` compte de 1 à 100 caractères, sans caractères de contrôle ni espace en début ou en fin. La valeur par défaut de l'API est `Token`.
- `expires_in_days` va de 30 à 730. La valeur par défaut de l'API est 365.
- `encrypted_token`, `created_at`, `expires_at` et `id` sont en lecture seule.

## Importation

La ressource ne peut pas être importée : la valeur d'un jeton existant ne peut plus jamais être relue, donc un jeton importé ne pourrait pas être livré. Révoquez un ancien jeton avec `keenauth directories tokens delete <directory_id> <token_id>` et laissez le fournisseur en créer un nouveau.
