
# keenauth_directory_token

La risorsa `keenauth_directory_token` crea un token bearer SCIM di una directory per l'identity provider che vi esegue il provisioning di utenti e gruppi. Il provider conserva il token nello stato solo cifrato con una chiave pubblica RSA che fornisci.

```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
}
```

## Il token non viene mai memorizzato in chiaro

L'API restituisce un token SCIM una sola volta, nella risposta che lo crea, e nessun endpoint può leggerlo in seguito. Il provider cifra il token con la tua chiave pubblica (RSA-OAEP con SHA-256, MGF1 SHA-256 ed etichetta vuota) e scrive in `encrypted_token` solo il testo cifrato in base64. Il token in chiaro non raggiunge mai lo stato, un file di plan, un output o un log. Solo il possessore della chiave privata può decifrarlo, quindi un file di stato trapelato non rivela il token.

Crea la coppia di chiavi una volta sola, fuori da OpenTofu, e tieni la chiave privata fuori dalla configurazione:

```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
```

Dopo `tofu apply`, decifra il token e consegnalo all'identity provider:

```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` deve essere una chiave pubblica RSA in formato PEM (`PUBLIC KEY` o `RSA PUBLIC KEY`) di almeno 2048 bit. Una chiave privata o una chiave più piccola viene rifiutata già in fase di plan. Se il provider non riesce a consegnare un token, lo revoca subito e l'apply fallisce, così non esiste alcun token valido che nessuno possiede.

## Solo creazione e revoca

Un token non può essere modificato. Ogni argomento (`directory_id`, `label`, `expires_in_days`, `public_key`) crea un nuovo token quando lo cambi, e il vecchio token viene revocato. Distruggere la risorsa revoca il token.

Un token revocato al di fuori del provider, o scaduto, viene rimosso dallo stato al refresh successivo, e l'apply successivo ne crea uno nuovo. Eliminare la directory elimina i suoi token.

## Rotazione

Una directory ha al massimo 2 token validi; un terzo viene rifiutato con `409`. Basta per ruotare senza interruzioni: con `create_before_destroy = true` il nuovo token viene creato prima che quello vecchio venga revocato. Consegna il nuovo token all'identity provider nella stessa finestra di modifica.

## Argomenti

- `label` è lungo da 1 a 100 caratteri, senza caratteri di controllo e senza spazi iniziali o finali. Il valore predefinito dell'API è `Token`.
- `expires_in_days` va da 30 a 730. Il valore predefinito dell'API è 365.
- `encrypted_token`, `created_at`, `expires_at` e `id` sono di sola lettura.

## Importazione

La risorsa non può essere importata: il valore di un token esistente non può mai essere riletto, quindi un token importato non potrebbe essere consegnato. Revoca un token vecchio con `keenauth directories tokens delete <directory_id> <token_id>` e lascia che il provider ne crei uno nuovo.
