> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trophy.so/llms.txt
> Use this file to discover all available pages before exploring further.

# Seguridad

> Crea endpoints de webhook seguros utilizando la verificación de firma de webhook.

<h2 id="webhook-signatures">
  Firmas de Webhook
</h2>

Para ayudarte a proteger tus manejadores de webhook para que solo respondan a eventos enviados desde Trophy y no a atacantes maliciosos, Trophy incluye una firma de webhook con cada evento.

Esta firma se envía en el encabezado `X-Trophy-Signature` y es un hash codificado en `base64` de la carga útil de la solicitud, hasheado utilizando un secreto de webhook seguro proporcionado por Trophy.

<h2 id="webhook-secrets">
  Secretos de Webhook
</h2>

Cada webhook que configuras en Trophy tiene un secreto de webhook único al que puedes acceder desde la [página de webhooks](https://app.trophy.so/integration/webhooks) en el panel de Trophy.

<Warning>
  Asegúrate de almacenar tu secreto de webhook en una **variable de entorno segura**
  y no lo incluyas en el control de versiones.
</Warning>

<h2 id="securing-webhook-handlers">
  Protección de Manejadores de Webhook
</h2>

Para validar que los eventos que recibe tu manejador de webhook realmente provienen de Trophy, necesitas crear tu propio hash utilizando tu [secreto de webhook](#webhook-secrets) seguro y compararlo con la [firma de webhook](#webhook-signatures) en el encabezado `X-Trophy-Signature`.

<Frame>
  <video autoPlay muted loop playsInline className="w-full aspect-15/4" src="https://mintcdn.com/trophy/J4Buo3161WwaYk4f/assets/webhooks/copy_secret.mp4?fit=max&auto=format&n=J4Buo3161WwaYk4f&q=85&s=b0c1002e7e17ad28ca80716e769ff2cb" data-path="assets/webhooks/copy_secret.mp4" />
</Frame>

Una vez que tengas tu secreto de webhook, estás listo para comenzar a validar eventos. Aquí tienes un ejemplo en Node.js:

```js Validating Webhook Events theme={null}
  // Extract X-Trophy-Signature header from the request
  const hmacHeader = request.headers.get("X-Trophy-Signature");

  // Create a hash based on the parsed body
  const hash = crypto
      .createHmac("sha256", process.env.TROPHY_WEBHOOK_SECRET as string)
      .update(await request.text())
      .digest("base64");

  // Compare the created hash with the value of the X-Trophy-Signature header
  if (hash === hmacHeader) {
      console.log("Webhook is originating from Trophy");
      // Request validated, continue processing
  } else {
      console.log("Signature is invalid, rejected");
      // Request is not from Trophy, reject with 4XX status
  }
```

<Warning>
  Si tu manejador detecta una solicitud que no se originó en Trophy, es
  importante rechazar la solicitud lo antes posible con un código de estado `4XX`.
</Warning>

<h2 id="get-support">
  Obtener Soporte
</h2>

¿Quieres ponerte en contacto con el equipo de Trophy? Comunícate con nosotros por [correo electrónico](mailto:support@trophy.so). ¡Estamos aquí para ayudarte!
