
# keenauth_directory

El recurso `keenauth_directory` crea un directorio SCIM 2.0 para una organización. Un directorio es el endpoint al que el proveedor de identidad de la organización (Okta, Entra ID y otros) aprovisiona usuarios y grupos.

```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` es `https://<scim_host>/scim/v2/<id>`. Entréguelo al proveedor de identidad junto con un token SCIM.

## Cambios en el sitio y reemplazos

`name` y la configuración del directorio se modifican en el sitio. El proveedor envía un JSON merge patch con solo los campos modificados y el ETag de la última lectura como `If-Match`; si el directorio cambió fuera de esta configuración después de esa lectura, la API responde `412`, no se cambia nada y debe ejecutar plan de nuevo. La API no acepta configuración al crear un directorio, por lo que la configuración que defina se aplica justo después de la creación, en el mismo apply.

Cambiar `organization_id`, `scim_host` o `type` reemplaza el directorio.

- Un reemplazo elimina primero el directorio antiguo. Eliminar un directorio es inmediato e irreversible: sus tokens, usuarios aprovisionados, grupos, membresías de grupos y retenciones pendientes de desaprovisionamiento se eliminan con él, y las solicitudes SCIM del proveedor de identidad reciben `401`. Un nuevo directorio tiene un nuevo ID y una nueva base URL, y el proveedor de identidad debe apuntar a él con un nuevo token.
- Proteja un directorio que no pueda permitirse perder con `lifecycle { prevent_destroy = true }`.
- Un directorio nuevo está `inactive`. El proveedor no lo activa ni lo desactiva (lo hacen `keenauth directories activate` y `deactivate`); `state` solo se lee.
- Eliminar la organización elimina sus directorios. Un directorio eliminado fuera del proveedor se quita del estado y se vuelve a planificar.

## Configuración

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

| Configuración | Valores | Valor predeterminado |
|---|---|---|
| `provisioning_mode` | `user_store` (se escriben los usuarios del entorno, las membresías de la organización y los roles de grupo) o `mirror` (solo se conservan los registros del directorio) | `user_store` |
| `attribute_allowlist` | Hasta 40 atributos SCIM opcionales que se conservan en los usuarios del directorio: `title`, `usertype`, `phonenumbers` y las claves de la extensión enterprise | vacío |
| `unverified_domain_action` | `invite` o `mirror_only`, para un usuario cuyo dominio de correo electrónico no está verificado para la organización | `invite` |
| `delete_action` | `remove_membership` o `delete_user`, para un `DELETE /Users` de SCIM | `remove_membership` |
| `on_delete_memberships` | `keep`, `suspend` o `remove`, para las membresías procedentes del directorio cuando este se elimina | `keep` |
| `mass_deprovision_guard` | `enabled`, `percent` (de 5 a 50) y `absolute_min` (de 10 a 1000); los desaprovisionamientos que superen ambos límites en 5 minutos quedan retenidos a la espera de aprobación | activado, 10, 25 |
| `send_welcome_email` | `true` o `false`: un correo de activación de cuenta para los nuevos usuarios del directorio | `false` |

- Una configuración que no defina conserva el valor del servidor, y quitar una configuración del archivo conserva su último valor. En `mass_deprovision_guard`, un campo que no defina conserva su valor.
- Quitar una clave de `attribute_allowlist` elimina ese atributo de todos los registros de usuario del directorio en la misma actualización. Un conjunto vacío (`[]`) vacía la lista.
- `provisioning_mode` no puede cambiar mientras el directorio tenga registros de usuario; la API responde `409`.

## Tokens SCIM

El token SCIM es un secreto. La API lo devuelve una sola vez, en la respuesta que crea el directorio, y ningún endpoint puede leerlo después. El proveedor nunca lo escribe en el estado, en un archivo de plan, en una salida ni en un registro. Para mantener esa garantía, y para que no exista ninguna credencial válida que nadie posea, el proveedor revoca de inmediato el token que devuelve la creación.

Cree el token para su proveedor de identidad con [`keenauth_directory_token`](/docs/terraform/directory-token). Este mantiene el token en el estado solo cifrado con su clave pública RSA, y usted lo descifra con su clave privada.

Si el proveedor no puede revocar el token inicial, el apply se completa igualmente y muestra una advertencia con el comando que lo revoca (`keenauth directories tokens delete <directory_id> <token_id>`).

## Argumentos

- `scim_host` es el host principal del entorno: su dominio personalizado activo; si no lo hay, `<slug>.<region>.keenauth.app`. Debe ser un nombre DNS en minúsculas que enrute a este entorno; de lo contrario, la API responde `422`. La API no comprueba que sea el host principal, por lo que se acepta un dominio personalizado secundario.
- `name` tiene de 1 a 64 caracteres, sin caracteres de control y sin espacios al principio ni al final. No necesita ser único.
- `type` es `scim` y no puede ser otro valor en GA-1.
- `state`, `base_url`, `created_at`, `etag` e `id` son de solo lectura. La API no devuelve `scim_host`, por lo que el proveedor lo deriva del host de `base_url`.

## Importación

Importe por ID de directorio:

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