
# keenauth_directory_token

Die Ressource `keenauth_directory_token` legt ein SCIM-Bearer-Token eines Verzeichnisses für den Identity Provider an, der dorthin Benutzer und Gruppen bereitstellt. Der Provider speichert das Token im State nur verschlüsselt mit einem öffentlichen RSA-Schlüssel, den Sie angeben.

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

## Das Token wird niemals im Klartext gespeichert

Die API gibt ein SCIM-Token einmal zurück, und zwar in der Antwort, die es anlegt; danach kann kein Endpunkt es lesen. Der Provider verschlüsselt das Token mit Ihrem öffentlichen Schlüssel (RSA-OAEP mit SHA-256, MGF1 mit SHA-256 und leerem Label) und schreibt nur den Base64-Chiffretext nach `encrypted_token`. Das Klartext-Token gelangt nie in den State, eine Plandatei, eine Ausgabe oder ein Log. Nur der Inhaber des privaten Schlüssels kann es entschlüsseln; eine abgeflossene State-Datei legt das Token daher nicht offen.

Erzeugen Sie das Schlüsselpaar einmal außerhalb von OpenTofu und halten Sie den privaten Schlüssel aus Ihrer Konfiguration heraus:

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

Entschlüsseln Sie nach `tofu apply` das Token und geben Sie es dem 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` muss ein PEM-kodierter öffentlicher RSA-Schlüssel (`PUBLIC KEY` oder `RSA PUBLIC KEY`) mit mindestens 2048 Bit sein. Ein privater Schlüssel oder ein kleinerer Schlüssel wird bereits bei der Planung abgelehnt. Kann der Provider kein Token ausliefern, widerruft er es sofort und das Apply schlägt fehl; so existiert kein gültiges Token, das niemand besitzt.

## Nur Anlegen und Widerrufen

Ein Token kann nicht geändert werden. Jedes Argument (`directory_id`, `label`, `expires_in_days`, `public_key`) erzeugt bei einer Änderung ein neues Token, und das alte Token wird widerrufen. Das Löschen der Ressource widerruft das Token.

Ein außerhalb des Providers widerrufenes oder abgelaufenes Token wird beim nächsten Refresh aus dem State entfernt, und das nächste Apply legt ein neues an. Das Löschen des Verzeichnisses löscht seine Tokens.

## Rotation

Ein Verzeichnis hat höchstens 2 gültige Tokens; ein drittes wird mit `409` abgelehnt. Das reicht für eine Rotation ohne Ausfallzeit: Mit `create_before_destroy = true` wird das neue Token angelegt, bevor das alte widerrufen wird. Geben Sie dem Identity Provider das neue Token im selben Änderungsfenster.

## Argumente

- `label` ist 1 bis 100 Zeichen lang, ohne Steuerzeichen und ohne führende oder nachgestellte Leerzeichen. Der API-Standardwert ist `Token`.
- `expires_in_days` liegt zwischen 30 und 730. Der API-Standardwert ist 365.
- `encrypted_token`, `created_at`, `expires_at` und `id` sind schreibgeschützt.

## Import

Die Ressource kann nicht importiert werden: Der Wert eines bestehenden Tokens kann nie wieder gelesen werden, ein importiertes Token könnte also nicht ausgeliefert werden. Widerrufen Sie ein altes Token mit `keenauth directories tokens delete <directory_id> <token_id>` und lassen Sie den Provider ein neues anlegen.
