
# keenauth_directory

Die Ressource `keenauth_directory` erstellt ein SCIM-2.0-Verzeichnis für eine Organisation. Ein Verzeichnis ist der Endpunkt, an den der Identitätsanbieter der Organisation (Okta, Entra ID und andere) Benutzer und Gruppen bereitstellt.

```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` lautet `https://<scim_host>/scim/v2/<id>`. Geben Sie sie zusammen mit einem SCIM-Token an den Identitätsanbieter weiter.

## Änderungen an Ort und Stelle und Ersetzungen

`name` und die Verzeichniseinstellungen werden an Ort und Stelle geändert. Der Provider sendet einen JSON-Merge-Patch mit nur den geänderten Feldern und dem ETag des letzten Lesevorgangs als `If-Match`. Wurde das Verzeichnis nach diesem Lesevorgang außerhalb dieser Konfiguration geändert, antwortet die API mit `412`, es wird nichts geändert, und Sie führen plan erneut aus. Die API nimmt beim Erstellen eines Verzeichnisses keine Einstellungen entgegen; die konfigurierten Einstellungen werden deshalb direkt nach dem Erstellen im selben Apply angewendet.

Das Ändern von `organization_id`, `scim_host` oder `type` ersetzt das Verzeichnis.

- Bei einer Ersetzung wird zuerst das alte Verzeichnis gelöscht. Das Löschen eines Verzeichnisses ist sofort und endgültig: Seine Tokens, bereitgestellten Benutzer, Gruppen, Gruppenmitgliedschaften und ausstehenden Deprovisionierungssperren werden mit entfernt, und SCIM-Anfragen des Identitätsanbieters erhalten `401`. Ein neues Verzeichnis hat eine neue ID und eine neue Basis-URL; der Identitätsanbieter muss mit einem neuen Token darauf umgestellt werden.
- Schützen Sie ein Verzeichnis, dessen Verlust Sie sich nicht leisten können, mit `lifecycle { prevent_destroy = true }`.
- Ein neues Verzeichnis ist `inactive`. Der Provider aktiviert oder deaktiviert es nicht (dafür sind `keenauth directories activate` und `deactivate` da); `state` wird nur gelesen.
- Das Löschen der Organisation löscht ihre Verzeichnisse. Ein Verzeichnis, das außerhalb des Providers gelöscht wurde, wird aus dem State entfernt und erneut geplant.

## Einstellungen

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

| Einstellung | Werte | Standard |
|---|---|---|
| `provisioning_mode` | `user_store` (Umgebungsbenutzer, Organisationsmitgliedschaften und Gruppenrollen werden geschrieben) oder `mirror` (nur Verzeichniseinträge werden gespeichert) | `user_store` |
| `attribute_allowlist` | Bis zu 40 optionale SCIM-Attribute, die bei Verzeichnisbenutzern erhalten bleiben: `title`, `usertype`, `phonenumbers` und die Schlüssel der Enterprise-Erweiterung | leer |
| `unverified_domain_action` | `invite` oder `mirror_only` für einen Benutzer, dessen E-Mail-Domain für die Organisation nicht verifiziert ist | `invite` |
| `delete_action` | `remove_membership` oder `delete_user` für ein SCIM-`DELETE /Users` | `remove_membership` |
| `on_delete_memberships` | `keep`, `suspend` oder `remove` für Mitgliedschaften aus dem Verzeichnis, wenn es gelöscht wird | `keep` |
| `mass_deprovision_guard` | `enabled`, `percent` (5 bis 50) und `absolute_min` (10 bis 1000); mehr Deprovisionierungen als beide Werte innerhalb von 5 Minuten werden zur Genehmigung zurückgehalten | aktiviert, 10, 25 |
| `send_welcome_email` | `true` oder `false`: eine E-Mail zur Kontoaktivierung für neue Verzeichnisbenutzer | `false` |

- Eine Einstellung, die Sie nicht konfigurieren, behält den Serverwert, und das Entfernen einer Einstellung aus der Konfiguration behält ihren letzten Wert. In `mass_deprovision_guard` behält ein Feld, das Sie nicht setzen, seinen Wert.
- Das Entfernen eines Schlüssels aus `attribute_allowlist` löscht dieses Attribut im selben Update aus jedem Benutzerdatensatz des Verzeichnisses. Eine leere Menge (`[]`) leert die Liste.
- `provisioning_mode` kann sich nicht ändern, solange das Verzeichnis Benutzerdatensätze enthält; die API antwortet mit `409`.

## SCIM-Tokens

Das SCIM-Token ist ein Geheimnis. Die API gibt es einmal zurück, und zwar in der Antwort, die das Verzeichnis erstellt; danach kann kein Endpunkt es mehr lesen. Der Provider schreibt es niemals in den State, eine Plan-Datei, eine Ausgabe oder ein Log. Damit diese Garantie gilt und kein gültiges Zugangsdatum existiert, das niemand besitzt, widerruft der Provider das beim Erstellen zurückgegebene Token sofort.

Erstellen Sie das Token für Ihren Identitätsanbieter mit [`keenauth_directory_token`](/docs/terraform/directory-token). Es wird nur verschlüsselt mit Ihrem öffentlichen RSA-Schlüssel im State gespeichert, und Sie entschlüsseln es mit Ihrem privaten Schlüssel.

Wenn der Provider das initiale Token nicht widerrufen kann, war das Apply trotzdem erfolgreich, und es erscheint eine Warnung mit dem Befehl zum Widerrufen (`keenauth directories tokens delete <directory_id> <token_id>`).

## Argumente

- `scim_host` ist der primäre Host der Umgebung: ihre aktive benutzerdefinierte Domain, andernfalls `<slug>.<region>.keenauth.app`. Er muss ein kleingeschriebener DNS-Name sein, der zu dieser Umgebung führt, sonst antwortet die API mit `422`. Die API prüft nicht, ob es sich um den primären Host handelt, daher wird eine sekundäre benutzerdefinierte Domain akzeptiert.
- `name` hat 1 bis 64 Zeichen, ohne Steuerzeichen und ohne führende oder nachgestellte Leerzeichen. Er muss nicht eindeutig sein.
- `type` ist `scim` und kann in GA-1 nichts anderes sein.
- `state`, `base_url`, `created_at`, `etag` und `id` sind schreibgeschützt. Die API gibt `scim_host` nicht zurück, daher leitet der Provider ihn aus dem Host von `base_url` ab.

## Import

Importieren Sie anhand der Verzeichnis-ID:

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