Saltar al contenido principal
El intercambio de tokens On-Behalf-Of (OBO) (RFC 8693) permite que los servicios de nivel intermedio conserven la identidad y los permisos del usuario al llamar a APIs posteriores. Cuando una aplicación necesita llamar a una API posterior, puede usar:
  • Flujo de credenciales de cliente: La aplicación actúa en su propio nombre y se autentica como tal. La solicitud puede haber sido iniciada por un usuario, pero ese contexto se perderá. El servicio posterior solo conoce la identidad de la aplicación que realiza la llamada.
  • Intercambio de tokens On-Behalf-Of (OBO): La aplicación recibe un token con alcance de usuario y puede intercambiarlo por un token nuevo para llamar a servicios posteriores. Esto conserva la identidad y el contexto del usuario final original a lo largo de toda la cadena de llamadas.
Por ejemplo, si un usuario inicia una llamada al Servicio A y este luego llama al Servicio B, el intercambio de tokens OBO permite que el Servicio A intercambie el token de acceso del usuario por un token nuevo que:
  • Mantiene la identidad y los permisos del usuario original
  • Tiene alcances específicos para el Servicio B
  • Permite que el Servicio B tome decisiones de autorización basadas en el usuario final
Los intercambios de tokens OBO activan el trigger post-login de Actions, donde: Al igual que en un flujo de inicio de sesión estándar, los alcances que se devuelven para las llamadas a APIs posteriores se basan en las políticas de Role-Based Access Control (RBAC) del usuario.
Cuando compras el complemento Auth0 for AI Agents, puedes usar el límite máximo de tasa de la Authentication API de tu nivel de suscripción para los intercambios de tokens OBO. Por ejemplo, si usas Private Cloud 100 RPS, puedes superar el límite de 30 RPS para el intercambio de tokens OBO y aprovechar la capacidad completa de 100 RPS para tus solicitudes de intercambio de tokens OBO. El límite de la Authentication API es compartido y actúa como límite global para todas las solicitudes de la Authentication API, incluidos, en conjunto, los inicios de sesión, las renovaciones de tokens y los intercambios de tokens. Ponte en contacto con tu Technical Account Manager para obtener más información.

Casos de uso

Entre los casos de uso habituales del intercambio de tokens OBO se incluyen:
  • Servidores MCP que necesitan llamar a API de primera parte en nombre del usuario
  • Microservicios que necesitan llamar a servicios posteriores en nombre del usuario
Para permitir que sus aplicaciones llamen a API de terceros en nombre del usuario, use Token Vault.

Cómo funciona

El intercambio de tokens OBO permite que los servicios de nivel intermedio intercambien un token de usuario recibido por un nuevo token con alcance para un servicio de nivel inferior. El nuevo token conserva la identidad del usuario original y, al mismo tiempo, rastrea la cadena de servicios implicados en la carga útil del JSON Web Token (JWT).

Ejemplo: un servidor MCP llama a una API de primera parte

Un usuario se autentica con Auth0 en una aplicación cliente, que luego llama a un servidor MCP, el cual, a su vez, necesita llamar a una API de primera parte.

Paso 1: Autenticación del usuario

Cuando el usuario inicia sesión, Auth0 emite un token de acceso con el alcance del servidor MCP y las siguientes claims en la carga útil del JWT:
{
  "sub": "auth0|user123",
  "aud": "https://mcp-server.example.com",
  "azp": "spa_client_id" // o "client_id" según el dialecto del token
}
ClaimValorDescripción
subauth0|user123La identidad del usuario final
audhttps://mcp-server.example.comToken con alcance para el servidor MCP
azp (o client_id según el perfil del token de acceso)spa_client_idLa aplicación cliente que solicitó el token

Paso 2: Intercambio OBO

Mediante el intercambio de tokens OBO, el servidor MCP presenta el token del usuario a Auth0 y solicita un token de acceso para la API de primera parte con el alcance correspondiente. Auth0 emite un nuevo token de acceso para la API con las siguientes claims:
{
  "sub": "auth0|user123",
  "aud": "https://first-party-api.example.com",
  "azp": "mcp_server_client_id", // o "client_id" según el dialecto del token
  "act": {
    "sub": "mcp_server_client_id",
    "act": {
      "sub": "spa_client_id"
    }
  }
}
ClaimValueDescription
subauth0|user123Se conserva la misma identidad del usuario
audhttps://first-party-api.example.comToken con alcance para la API de primera parte
azp (o client_id según el perfil del token de acceso)mcp_server_client_idCliente que solicitó el token (el servidor MCP que realizó el intercambio)
act{"sub": "mcp_server_client_id",
"act": {"sub": "spa_client_id"}}
Cadena de delegación que muestra todos los actores implicados

El claim act

El claim act (actor) rastrea toda la cadena de delegación. Cada nivel de act representa un servicio de la cadena de llamadas, y el act.sub del nivel más externo identifica al actor actual que realizó el intercambio de tokens. En nuestro ejemplo:
  • act.sub del nivel más externo: mcp_server_client_id (el servidor MCP que acaba de intercambiar el token)
  • act.sub anidado: spa_client_id (la aplicación cliente original)
El claim azp debe coincidir con el valor de act.sub del nivel más externo, e identificar el servicio que realizó más recientemente el intercambio de tokens. Si la API de primera parte llama a otro servicio posterior (https://calendar-api.acme.com), la cadena de delegación se extendería:
{
  "sub": "auth0|user123",
  "aud": "https://calendar-api.acme.com",
  "azp": "first_party_api_client_id",
  "act": {
    "sub": "first_party_api_client_id",
    "act": {
      "sub": "mcp_server_client_id",
      "act": {
        "sub": "spa_client_id"
      }
    }
  }
}
La cadena de delegación está limitada a cinco niveles anidados. El intercambio de tokens OBO fallará si el token de sujeto ya tiene cinco niveles act anidados.
400 Bad Request
{
  "error": "invalid_request",
  "error_description": "Delegation chain (`act` claim) depth exceeds the maximum allowed limit of 4"
}
Almacene en caché los tokens de acceso durante toda su vida útil, en lugar de solicitar uno nuevo para cada llamada a la API. Los tokens de acceso se pueden reutilizar hasta que expiren; repetir los intercambios de tokens desperdicia recursos, aumenta la latencia y puede activar límites de velocidad.

Usuario > servidor MCP > flujo de la API

El siguiente diagrama muestra un flujo de intercambio de tokens OBO de extremo a extremo, en el que un servidor MCP invoca una API de primera parte en nombre del usuario:
  1. Autenticación del usuario: El usuario se autentica en la aplicación cliente. El Servidor de autorización de Auth0 emite el Token A, con alcance correspondiente al servidor MCP.
  2. Solicitud inicial: La aplicación cliente llama al servidor MCP y pasa el Token A en el encabezado Authorization: Bearer.
  3. Validación e intercambio de tokens: El servidor MCP recibe el Token A, lo valida y lo envía al endpoint /oauth/token del Servidor de autorización de Auth0. Mediante el intercambio de tokens OBO, el servidor MCP presenta el Token A como subject_token y solicita un nuevo token para la API de primera parte.
  4. Emisión del token: El Servidor de autorización de Auth0 emite el Token B. El Token B tiene el mismo sub (id de usuario) que el Token A, pero ahora aud (audiencia) es la API de primera parte.
  5. Llamada posterior: El servidor MCP llama a la API de primera parte con el Token B. La API valida el Token B y comprueba que la solicitud se está realizando legítimamente “en nombre del” usuario original.

Usuario > API1 > API2 > API3

El siguiente diagrama muestra un flujo integral de una cadena de microservicios que realizan llamadas a servicios posteriores en nombre del usuario:
  1. Autenticación del usuario: El usuario se autentica correctamente con una aplicación cliente. El Servidor de autorización de Auth0 emite el Token A, con alcance para API1.
  2. Solicitud inicial: La aplicación cliente llama a API1 y envía el Token A en el encabezado Authorization: Bearer.
  3. API1 delega en API2: API1 recibe el Token A, lo valida y luego lo envía al endpoint /oauth/token del Servidor de autorización de Auth0. Mediante el intercambio de tokens OBO, API1 presenta el Token A como subject_token y solicita un nuevo token para API2.
  4. Emisión del token: El Servidor de autorización de Auth0 concede un nuevo token de acceso, el Token B, a API1. El Token B tiene el mismo sub (ID de usuario) que el Token A, pero ahora el aud (audiencia) es API2.
  5. Llamada posterior: API1 realiza una solicitud a API2 con el Token B.
  6. API2 delega en API3: API2 recibe el Token B, lo valida y luego lo envía al endpoint /oauth/token del Servidor de autorización de Auth0. Mediante el intercambio de tokens OBO, API2 presenta el Token B como subject_token y solicita un nuevo token para API3.
  7. Emisión del token: El Servidor de autorización de Auth0 concede un nuevo token de acceso, el Token C, a API2. El Token C tiene el mismo sub (ID de usuario) que los Tokens A y B, pero ahora el aud (audiencia) es API3.
  8. Llamada posterior: API2 realiza una solicitud a API3 con el Token C. API3 valida el Token C y comprueba que la solicitud se realiza legítimamente “en nombre del” usuario original.

Requisitos previos

Solo los clientes de API personalizada asociados a un servidor de recursos pueden usar el intercambio de tokens OBO. Un cliente de API personalizada se vincula a un servidor de recursos cuando ambos comparten el mismo identificador. Los clientes de API personalizada deben cumplir los siguientes requisitos:
  • Establezca app_type en resource_server.
  • Establezca resource_server_identifier en un servidor de recursos válido; es decir, https://my-api.example.com. Auth0 usa el identificador del servidor de recursos como el parámetro audience en las llamadas de autorización.
Como los clientes de API personalizada son clientes de primera parte, asegúrese de omitir el consentimiento del usuario para las API a las que debe acceder su cliente de primera parte.

Crear un cliente de API personalizada

Puede crear un cliente de API personalizada con Auth0 Dashboard o la Management API.
Para crear un cliente de API personalizada en Auth0 Dashboard:
  1. Vaya a Applications > APIs y seleccione su API de backend.
My Test OBO API
  1. Seleccione Add Application e introduzca un nombre para la aplicación.
  2. Seleccione Add.
Una vez que la aplicación se haya creado correctamente, revísela seleccionando Configure Application y, a continuación, desplácese hasta Application Properties. El Application Type es Custom API Client.
My Test OBO API

Crear client grant

Debes crear un client grant delegado por el usuario entre el cliente de API personalizada y la API de destino para autorizar el acceso.
  1. Ve a Applications > Applications y selecciona tu cliente de API personalizada.
  2. En API Access, busca tu servidor de recursos (es decir, https://my-api.example.com) y selecciona Edit.
  3. En User-Delegated Access, selecciona Grant Access y, a continuación, selecciona los permisos que quieras conceder o Always grant all permissions.
  4. Selecciona Save.

Configura el intercambio de tokens OBO

Aprende a configurar tu cliente de API personalizada para usar la concesión de intercambio de tokens OBO.
  1. Ve a Applications > Applications y selecciona tu cliente de API personalizada.
  2. En Token Exchange, activa On-Behalf-Of Token Exchange.
  3. Selecciona Save.
Mi API OBO de prueba

Realizar el intercambio de tokens OBO

Para realizar el intercambio de tokens OBO, puede usar auth0-api-js, auth0_api_python o la Authentication API.
Guarde en caché los tokens de acceso durante toda su vigencia, en lugar de solicitar uno nuevo para cada llamada a la API. Los tokens de acceso se pueden reutilizar hasta que expiren; repetir los intercambios de tokens desperdicia recursos, aumenta la latencia y puede desencadenar límites de tasa.
Antes de empezar, asegúrate de haber instalado la biblioteca auth0-api-js y sus dependencias.Primero, inicializa ApiClient con las credenciales de tu servidor MCP:
import { ApiClient } from '@auth0/auth0-api-js';

const apiClient = new ApiClient({
  domain: 'YOUR_AUTH0_DOMAIN',
  audience: 'YOUR_MCP_SERVER_AUDIENCE',
  clientId: 'YOUR_CLIENT_ID',
  clientSecret: 'YOUR_CLIENT_SECRET',
});
A continuación, usa el método getTokenOnBehalfOf() para intercambiar tokens:
const result = await apiClient.getTokenOnBehalfOf(accessToken, {
  audience: 'YOUR_DOWNSTREAM_API_AUDIENCE',
  scope: 'read:private',  // Opcional
});
getTokenOnBehalfOf() devuelve un objeto que contiene:
  • accessToken: El nuevo token para la API de nivel inferior
  • scope: Los alcances otorgados
  • expiresIn: Tiempo de expiración del token en segundos

Compatibilidad con organizaciones

Cuando un usuario se autentica a través de una organización, el token de acceso incluye el claim org_id. El intercambio de tokens OBO conserva este contexto de organización a lo largo de toda la cadena de delegación. Cuando Auth0 recibe una solicitud de intercambio de tokens OBO con un token de acceso asociado a una organización, valida lo siguiente:
  • Que org_id exista en tu inquilino
  • Que el usuario (identificado por sub) sea miembro de esa organización
Si la validación falla, Auth0 rechaza la solicitud de intercambio de tokens. Si se valida correctamente, Auth0 emite un nuevo token de acceso que:
  • Contiene el mismo claim org_id que el token original
  • Aplica las mismas políticas de RBAC específicas de la organización
  • Hace que el contexto de la organización esté disponible en el trigger post-login de Actions mediante la propiedad event.organization