keenauth_webhook_endpoint

El recurso keenauth_webhook_endpoint gestiona un endpoint de webhook: una dirección HTTPS que recibe los eventos del entorno, firmados con Standard Webhooks. El proveedor mantiene el secreto de firma en el estado solo cifrado con una clave pública RSA que usted le proporciona.

resource "keenauth_webhook_endpoint" "orders" {
  key         = "orders"
  url         = "https://hooks.example.com/keenauth"
  description = "Order service"
  event_types = ["user.created", "user.updated", "organization.created"]
  event_schema_versions = {
    "user.created" = 1
  }
  public_key = file("${path.module}/webhook-secret-key.pub.pem")

  rotation_trigger          = time_rotating.webhook_secret.id
  previous_secret_ttl_hours = 48
}

resource "time_rotating" "webhook_secret" {
  rotation_days = 90
}

output "orders_webhook_secret_encrypted" {
  value = keenauth_webhook_endpoint.orders.encrypted_signing_secret
}

Argumentos

Cada argumento se cambia en su lugar. Las actualizaciones envían solo los campos modificados como JSON Merge Patch, con el ETag de la última lectura como If-Match. Si el endpoint se modificó en otro lugar después de la última lectura, el apply falla con 412 y no se cambia nada; ejecute plan de nuevo para revisar la desviación.

El secreto de firma nunca se almacena en texto plano

La API devuelve el secreto de firma (idp_whsec_…) solo cuando se crea el endpoint y cuando se rota el secreto. Con public_key, el proveedor cifra el secreto con RSA-OAEP (SHA-256, MGF1 SHA-256, etiqueta vacía) y escribe solo el texto cifrado en base64 en encrypted_signing_secret. Sin public_key, el secreto se descarta; rótelo más adelante con keenauth webhook-endpoints rotate-secret o establezca public_key. El secreto en texto plano nunca llega al estado, a un archivo de plan, a una salida ni a un registro.

Cree el par de claves una sola vez, fuera de OpenTofu, y mantenga la clave privada fuera de su configuración:

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out webhook-secret-key.pem
openssl pkey -in webhook-secret-key.pem -pubout -out webhook-secret-key.pub.pem

Después de tofu apply, descifre el secreto y entréguelo al receptor:

tofu output -raw orders_webhook_secret_encrypted | base64 -d | \
  openssl pkeyutl -decrypt -inkey webhook-secret-key.pem \
    -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pkeyopt rsa_mgf1_md:sha256

public_key debe ser una clave pública RSA codificada en PEM (PUBLIC KEY o RSA PUBLIC KEY) de al menos 2048 bits. Una clave privada o una clave más pequeña se rechaza en el momento del plan.

Rotación

El secreto se rota cuando establece o cambia public_key, y cuando rotation_trigger cambia a un valor nuevo, por ejemplo el ID de un recurso time_rotating. Después de una rotación, el secreto anterior sigue firmando junto al nuevo durante previous_secret_ttl_hours (de 0 a 168; el predeterminado de la API es 24; 0 lo elimina de inmediato), para que el receptor pueda cambiar sin perder eventos. previous_secret_expires_at muestra cuándo deja de funcionar el secreto anterior. Eliminar public_key solo elimina encrypted_signing_secret; no rota el secreto.

Límites y estado

Un endpoint habilitado cuenta para el límite del plan por entorno: Free 3, Startup 20, Business 20, Enterprise 50. Crear o habilitar uno más falla con 403 quota_exceeded; deshabilite o elimine otro endpoint, o actualice el plan.

KeenAuth deshabilita un endpoint que sigue fallando (disabled_by_failure) o cuyo receptor responde 410 Gone (disabled_by_receiver). El siguiente plan muestra el cambio de vuelta al status configurado, y al aplicarlo el endpoint vuelve a habilitarse.

Importación

Importe con el ID del endpoint o con su clave:

tofu import keenauth_webhook_endpoint.orders orders

El secreto de firma no se puede leer de nuevo, así que encrypted_signing_secret queda vacío después de la importación. Si su configuración establece public_key, el siguiente apply rota el secreto y entrega el nuevo cifrado.

Los envíos de prueba, las repeticiones y los reintentos de entrega son acciones puntuales, no configuración. Para ellos use keenauth webhook-endpoints test, replay y deliveries.