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

# Autenticación

> Autenticación en el API V3 de Justo

## Obtener un Token

<Steps>
  <Step title="Crear aplicación">
    Entra a developers.getjusto.com y crea una nueva app
  </Step>

  <Step title="Crea una nueva autorización">
    Despues de crear la aplicación debes crear una autorización para obtener
    acceso a una marca. Debes seleccionar los permisos que necesitas para tu
    aplicación. No se puede cambiar despues.
  </Step>

  <Step title="Solicita la autorización al cliente">
    Enviale a la marca la URL que se indica en el portal para que te entregue el
    acceso.
  </Step>

  <Step title="Obten el token">
    Una vez que la marca te de acceso, puedes obtener el token de autenticación.
    Este token solo lo podrás ver una vez asi que asegurate de guardarlo en un
    lugar seguro. Los token no expiran pero puedes generar uno nuevo y el
    anterior dejará de funcionar.
  </Step>
</Steps>

## Autenticar Requests

Para autenticar tus requests debes enviar el token en el header `Authorization` de la siguiente manera:

<CodeGroup>
  ```javascript test.js theme={null}
  fetch('https://api.service.getjusto.com/v3/api/me', {
    headers: {
      Authorization: 'Bearer ' + token,
    },
  });
  ```
</CodeGroup>

## Autenticación de Webhooks

Al configurar un webhook puedes elegir el método de autenticación que usará Justo al llamar tu endpoint. Por defecto se usa firma HMAC.

### Firma HMAC

Justo firma cada webhook con el token del webhook. La firma permite validar que el request fue enviado por Justo y que el payload no fue modificado.

La firma se envía en el header `X-Hub-Signature`:

```http theme={null}
X-Hub-Signature: sha256=<firma_en_hex>
```

Para validar un webhook:

1. Lee el body crudo del request, antes de parsearlo como JSON.
2. Calcula `HMAC-SHA256(rawBody, webhookSecret)`.
3. Convierte el resultado a hexadecimal.
4. Compara el resultado con el valor del header, removiendo el prefijo `sha256=`.

No reconstruyas el payload con `JSON.stringify(req.body)` para validar la firma. Cambios de espacios, orden de propiedades o formato de fechas pueden producir una firma distinta. Usa siempre el body exacto recibido por HTTP.

<CodeGroup>
  ```javascript Node.js theme={null}
  import crypto from 'crypto'

  function verifyJustoWebhook(rawBody, signatureHeader, webhookSecret) {
    const receivedSignature = signatureHeader.replace('sha256=', '')

    const expectedSignature = crypto
      .createHmac('sha256', webhookSecret)
      .update(rawBody)
      .digest('hex')

    return crypto.timingSafeEqual(
      Buffer.from(receivedSignature, 'utf8'),
      Buffer.from(expectedSignature, 'utf8'),
    )
  }
  ```
</CodeGroup>

### Token en Authorization

También puedes configurar el webhook para que Justo envíe el token del webhook directamente en el header `Authorization`:

```http theme={null}
Authorization: Bearer <token_del_webhook>
```

Este método no firma el payload. Úsalo cuando tu integración espera validar el token del webhook en el header de autorización.

### Token de API en Authorization

También puedes configurar el webhook para que Justo envíe exactamente el mismo token que tu integración usa para autenticar requests hacia nuestra API:

```http theme={null}
Authorization: Bearer <token_de_api>
```

Este token corresponde a la autorización asociada al webhook. Si el token fue generado antes de que esta opción estuviera disponible, Justo lo guardará la próxima vez que tu integración haga un request válido a la API con ese token. Si todavía no existe un token guardado, el webhook no podrá enviarse con este método hasta que hagan un request válido o generen un token nuevo.
