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

# Autorización JWT

> Autentica solicitudes a la API mediante tokens JWT Bearer emitidos por tu proveedor de identidad (Entra ID, Okta, etc.) para integraciones entre sistemas.

## Resumen

La autenticación con JWT permite llamar a la API de Corgea mediante tokens Bearer emitidos directamente por el proveedor de identidad (IdP), como Microsoft Entra ID u Okta, en lugar de utilizar un token de API de Corgea asociado a un usuario.

Este es el método recomendado para **integraciones entre sistemas** —como pipelines de CI/CD, escáneres automatizados o herramientas internas— cuando necesitas:

* Asociar los tokens a una entidad de servicio o un registro de aplicación, en lugar de a una cuenta de usuario concreta
* Controlar la vigencia y el ámbito del token desde el IdP
* Revocar tokens de forma centralizada desde el IdP sin modificar Corgea

Los tokens de API de Corgea siempre están asociados a usuarios individuales. Si un usuario deja la organización o se desactiva su cuenta, cualquier automatización que utilice su token deja de funcionar. La autenticación JWT elimina esta dependencia de las cuentas de usuario.

## Cómo funciona

1. Tu sistema solicita un token de acceso al IdP mediante las credenciales del cliente (ID y secret del cliente).
2. El IdP devuelve un JWT firmado que contiene claims como `iss` (emisor) y `aud` (audiencia).
3. Tu sistema envía el token como token `Bearer` en la cabecera `Authorization` al llamar a la API de Corgea.
4. Corgea valida la firma del token con las claves públicas del IdP y comprueba que los claims `iss`, `aud` y `appid`/`cid` coincidan con la configuración registrada.

## Utilizar JWT con la CLI de Corgea

Puedes usar un token de acceso JWT directamente con el flujo de inicio de sesión de la CLI:

```bash theme={null}
corgea login YOUR_JWT_TOKEN
```

O configúralo mediante la variable de entorno:

<CodeGroup>
  ```bash macOS / Linux theme={null}
  export CORGEA_TOKEN="your-jwt-access-token"
  corgea login
  ```

  ```powershell Windows theme={null}
  $env:CORGEA_TOKEN="your-jwt-access-token"
  corgea login
  ```
</CodeGroup>

## Configurar la autenticación JWT en Corgea

Navega a **Configuración → Integraciones** y haz clic en **+ Añadir** en la sección de autenticación de JWT.

<Card>
  <img src="https://mintcdn.com/corgea/shid6yjMRFa2jrlq/images/jwt_token/corgae_jwt_token_form.png?fit=max&auto=format&n=shid6yjMRFa2jrlq&q=85&s=4e2279f885450dc9756704ae02ef498a" style={{ borderRadius: '0.5rem' }} alt="Añadir formulario de configuración de autenticación JWT en Corgea" width="2796" height="2116" data-path="images/jwt_token/corgae_jwt_token_form.png" />
</Card>

Rellena los siguientes campos:

| Campo                            | Descripción                                                                            |
| -------------------------------- | -------------------------------------------------------------------------------------- |
| **Nombre**                       | Una etiqueta descriptiva para esta configuración (por ejemplo, `Entra CICD Pipeline`). |
| **Emisor**                       | URL del emisor del token; debe coincidir con el claim `iss` del token de acceso.       |
| **Audiencia**                    | Debe coincidir con el claim `aud` del token de acceso.                                 |
| **IDs de aplicación permitidos** | Un ID de cliente por línea — la aplicación que puede usar esta configuración.          |

<Info>
  Utiliza [jwt.io](https://jwt.io) para decodificar un token de acceso del IdP y comprobar los valores exactos de `iss`, `aud` y `appid`/`cid` antes de completar el formulario.
</Info>

**Valores específicos de cada proveedor:**

* **Emisor de Entra ID**: `https://sts.windows.net/{your-tenant-id}/`
* **Audiencia de Entra ID**: el URI del ID de aplicación de tu aplicación (por ejemplo, `api://{client_id}`) — establecida mediante **Expose an API** en Entra
* **Emisor de Okta**: `https://{domain}.okta.com/oauth2/default`
* **Audiencia de Okta**: `api://default` (o la audiencia del servidor de autorización personalizado)

## Configuración de ID Microsoft Entra

<Steps>
  <Step title="Registra una aplicación en Entra">
    En [Azure Portal](https://portal.azure.com), ve a **Microsoft Entra ID → Registros de aplicaciones → Nuevo registro**. Asigna a la aplicación un nombre descriptivo, como `corgea-cicd`, y regístrala.
  </Step>

  <Step title="Expone una API y establece el URI del ID de la aplicación">
    Ve a **Exponer una API** en el registro de la aplicación. Establece o confirma el **URI del ID de aplicación**; este valor se convierte en el claim `aud` de los tokens emitidos para la aplicación.

    <Card>
      <img src="https://mintcdn.com/corgea/shid6yjMRFa2jrlq/images/jwt_token/entra_expose_an_api.png?fit=max&auto=format&n=shid6yjMRFa2jrlq&q=85&s=d04b83470b69fca5190511bef80e3129" style={{ borderRadius: '0.5rem' }} alt="Expose an API en Microsoft Entra" width="6054" height="2320" data-path="images/jwt_token/entra_expose_an_api.png" />
    </Card>

    Copia el URI del ID de la aplicación, por ejemplo `api://5d63c8f0-c9a8-4195-90ee-a9e27e4510b8`. Lo introducirás como **Audiencia** en Corgea.
  </Step>

  <Step title="Crear un secreto para el cliente">
    Ve a **Certificados y secretos → Nuevo secreto de cliente**. Añade una descripción y establece una fecha de caducidad, luego haz clic en **Añadir**.

    <Card>
      <img src="https://mintcdn.com/corgea/shid6yjMRFa2jrlq/images/jwt_token/entra_client_secret.png?fit=max&auto=format&n=shid6yjMRFa2jrlq&q=85&s=e09e3cdc9aed42edd27ba14d6c294a0d" style={{ borderRadius: '0.5rem' }} alt="Añadir un secreto de cliente en Microsoft Entra" width="5798" height="2372" data-path="images/jwt_token/entra_client_secret.png" />
    </Card>

    Copia inmediatamente el **Valor** del secret, pues solo se muestra una vez. Guárdalo de forma segura, por ejemplo en el almacén de secrets de CI/CD.
  </Step>

  <Step title="Solicitar un token de acceso">
    Tu sistema solicita un token a Entra usando el flujo de credenciales del cliente:

    <CodeGroup>
      ```bash macOS / Linux theme={null}
      curl -X POST \
        https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token \
        -d "grant_type=client_credentials" \
        -d "client_id={client-id}" \
        -d "client_secret={client-secret}" \
        -d "scope=api://{client-id}/.default"
      ```

      ```powershell Windows theme={null}
      Invoke-RestMethod -Method Post `
        -Uri "https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token" `
        -Body @{
          grant_type    = "client_credentials"
          client_id     = "{client-id}"
          client_secret = "{client-secret}"
          scope         = "api://{client-id}/.default"
        }
      ```
    </CodeGroup>

    La respuesta contiene un `access_token`. Envíalo como token Bearer al llamar a Corgea:

    <CodeGroup>
      ```bash macOS / Linux theme={null}
      curl -H "Authorization: Bearer {access_token}" https://www.corgea.app/api/...
      ```

      ```powershell Windows theme={null}
      Invoke-RestMethod -Uri "https://www.corgea.app/api/..." `
        -Headers @{ Authorization = "Bearer {access_token}" }
      ```
    </CodeGroup>

    <Note>
      Sustituye `https://www.corgea.app` por `https://your_instance.corgea.app` si utilizas un despliegue privado.
    </Note>
  </Step>

  <Step title="Registrar la configuración en Corgea">
    En el formulario **Añadir configuración de autenticación JWT** de Corgea, introduce:

    * **Emisor**: `https://sts.windows.net/{your-tenant-id}/`
    * **Audiencia**: el URI del ID de la aplicación del Paso 2 (por ejemplo, `api://5d63c8f0-...`)
    * **ID de aplicación permitido**: el **ID de la aplicación (cliente)** desde el registro de tu aplicación

    Haz clic en **Añadir** para guardar.
  </Step>
</Steps>

## Pruebas con Postman

Si prefieres una interfaz gráfica a curl, puedes probar directamente en Postman la solicitud del token y la llamada a la API.

**Importar un comando de curl**

Postman puede convertir cualquiera de los comandos curl anteriores en una solicitud. Haz clic en **Importar** en la esquina superior izquierda y pega el comando; Postman completará automáticamente el método, la URL, las cabeceras y el cuerpo.

<Card>
  <img src="https://mintcdn.com/corgea/9RMZY-Ts5g1RCFSA/images/jwt_token/postman_import_curl.png?fit=max&auto=format&n=9RMZY-Ts5g1RCFSA&q=85&s=d634e6065afdb582aa09a69b9a21ff5f" style={{ borderRadius: '0.5rem' }} alt="Importando un comando de curl en Postman" width="2026" height="1202" data-path="images/jwt_token/postman_import_curl.png" />
</Card>

**Solicitar un token de acceso**

Rellena `tenant-id`, `client_id`, `client_secret` y `scope` en los campos del cuerpo y envía la solicitud. Después, copia el valor `access_token` de la respuesta.

<Card>
  <img src="https://mintcdn.com/corgea/9RMZY-Ts5g1RCFSA/images/jwt_token/postman_request_access.png?fit=max&auto=format&n=9RMZY-Ts5g1RCFSA&q=85&s=eb94f562884a32bb361dbd23206c03b7" style={{ borderRadius: '0.5rem' }} alt="Solicitar un token de acceso en Postman usando las credenciales del cliente" width="2400" height="2066" data-path="images/jwt_token/postman_request_access.png" />
</Card>

**Llama a la API de Corgea con el token**

Crea una solicitud al endpoint de Corgea. En la pestaña **Autorización**, selecciona **Token Bearer** como tipo y pega el `access_token`.

<Card>
  <img src="https://mintcdn.com/corgea/9RMZY-Ts5g1RCFSA/images/jwt_token/postman_call_api_with_token.png?fit=max&auto=format&n=9RMZY-Ts5g1RCFSA&q=85&s=66c68bafb415fa42282f6225d50bcd9f" style={{ borderRadius: '0.5rem' }} alt="Llamando a la API de Corgea con un token portador en Postman" width="2522" height="2462" data-path="images/jwt_token/postman_call_api_with_token.png" />
</Card>

<Note>
  Si tu empresa restringe el acceso saliente a la red, quizá debas configurar un proxy. En Postman, ve a **Configuración → Proxy** y añade el proxy corporativo. Para curl, establece la variable de entorno `HTTPS_PROXY` o pasa `--proxy https://your-proxy:port`.
</Note>

## Verificar el token

Utiliza [jwt.io](https://jwt.io) para decodificar un token de acceso antes de configurar Corgea. Pega el token en el depurador e inspecciona el **payload decodificado** para confirmar los valores de `iss`, `aud` y `appid`.

<Card>
  <img src="https://mintcdn.com/corgea/shid6yjMRFa2jrlq/images/jwt_token/jwt_io.png?fit=max&auto=format&n=shid6yjMRFa2jrlq&q=85&s=d00c729ec30d74b31bd448b410e67ca0" style={{ borderRadius: '0.5rem' }} alt="Descifrar un token JWT en jwt.io para verificar las reclamaciones de ISS y AUD" width="2776" height="2326" data-path="images/jwt_token/jwt_io.png" />
</Card>

Los campos resaltados `aud` e `iss` son exactamente los que Corgea comprueba al validar las solicitudes entrantes.

## Resolución de problemas

* **401 No autorizado**: Decodifica el token en jwt.io y confirma que `iss`, `aud` y `appid` coincidan exactamente con los valores de la configuración de autenticación JWT de Corgea.
* **Token rechazado tras la rotación**: Si has rotado el secret del cliente, actualízalo en el entorno de CI/CD. No es necesario modificar la configuración de Corgea, porque valida los claims del token, no el secret.
* **Varios entornos**: Crea una configuración de autenticación JWT distinta en Corgea para cada aplicación o entorno —por ejemplo, staging y producción— mediante registros de aplicación con ID de cliente diferentes.

### Problemas de conectividad de red

Si la solicitud de token o la llamada a la API falla con un error de conexión, utiliza estos comandos para investigar si un firewall o proxy está bloqueando el tráfico.

<CodeGroup>
  ```bash macOS / Linux theme={null}
  # Check DNS resolution
  nslookup login.microsoftonline.com
  nslookup www.corgea.app

  # Check TCP connectivity on port 443
  nc -zv login.microsoftonline.com 443
  nc -zv www.corgea.app 443

  # Trace the network path
  traceroute login.microsoftonline.com

  # Test with verbose curl output (shows TLS handshake and redirect chain)
  curl -v https://login.microsoftonline.com

  # Test through a proxy if required
  curl -v --proxy https://your-proxy:port https://login.microsoftonline.com
  ```

  ```powershell Windows theme={null}
  # Check DNS resolution
  Resolve-DnsName login.microsoftonline.com
  Resolve-DnsName www.corgea.app

  # Check TCP connectivity on port 443
  Test-NetConnection -ComputerName login.microsoftonline.com -Port 443
  Test-NetConnection -ComputerName www.corgea.app -Port 443

  # Trace the network path
  tracert login.microsoftonline.com

  # Test with verbose curl output
  curl.exe -v https://login.microsoftonline.com

  # Test through a proxy if required
  curl.exe -v --proxy https://your-proxy:port https://login.microsoftonline.com
  ```
</CodeGroup>

Si falla la prueba de conexión TCP o traceroute se detiene en un salto interno, pide al equipo de redes o seguridad que permita el tráfico HTTPS saliente (puerto 443) hacia `login.microsoftonline.com` y `www.corgea.app`.
