• oidc
  • oauth
  • token-exchange
  • openid

Entendiendo el intercambio de tokens en OAuth/OIDC

El intercambio de tokens es una extensión de OAuth que permite a los clientes de confianza obtener nuevos tokens sin interacción del usuario, lo cual es útil para la suplantación, automatización, integración entre sistemas y migración de tokens en varios escenarios.

Sijie
Sijie
Developer

Introducido en RFC 8693, el intercambio de tokens es una extensión de OAuth que permite a los clientes de confianza intercambiar un token existente por uno nuevo con diferentes atributos o alcances. Este mecanismo es particularmente útil para que un servicio, una aplicación o un usuario final obtenga un token de acceso OAuth normal a través de un token preautorizado, sin necesidad de pasar por todo el flujo de OAuth.

Comparación con el flujo de código de autorización

Primero, veamos el flujo de Código de Autorización de OAuth, que es el flujo más común para obtener un token de acceso.

Y este es el flujo de intercambio de tokens:

Redirección

La diferencia principal es que en el flujo de código de autorización, la aplicación cliente redirige al usuario al servidor de autorización para obtener un token de acceso. En el intercambio de tokens, la aplicación cliente puede intercambiar un token con el servidor de autorización sin involucrar al usuario para redirigir.

Eso se debe a que en el flujo de código de autorización, la aplicación cliente no es "de confianza" y necesita conocer las credenciales del usuario para obtener un token de acceso. En el intercambio de tokens, la aplicación cliente se considera confiable para haber obtenido ya el token del usuario, y el servidor de autorización validará el token y emitirá uno nuevo.

Emisor de tokens y servicio de intercambio de tokens

En el flujo de intercambio de tokens, el "Auth Server" ahora son dos participantes:

  1. Emisor de tokens: emite el token de sujeto a la aplicación cliente.
  2. Servicio de intercambio de tokens: valida el token de sujeto y emite un nuevo token para la aplicación cliente.

El servicio de intercambio de tokens es igual al "Auth Server" en el flujo de código de autorización, y el emisor de tokens puede ser un proveedor de identidad de terceros o estar separado del "Auth Server" como un servicio dedicado.

¿Cuándo usar el intercambio de tokens?

El flujo de intercambio de tokens se puede realizar sin interacción del usuario, lo cual es útil en los siguientes escenarios:

  • Suplantación: Permitir que los servicios (por ejemplo, microservicios backend) o los usuarios administradores realicen acciones en nombre de un usuario sin exponer las credenciales completas del usuario.
  • Automatización: Permitir que los servicios de confianza realicen acciones automáticamente sin intervención manual, o realizar pruebas automatizadas.
  • Integración con otros IdPs: Traducir tokens a través de diferentes sistemas de identidad para mantener una experiencia de usuario sin problemas y gestionar permisos de manera efectiva, un escenario común es traducir un token SSO a un token para un servicio descendente.
  • Migración: Migrar tokens de un servidor de autorización a otro, por ejemplo, de un sistema heredado a un sistema moderno compatible con OAuth/OIDC.

Proceso de intercambio de tokens

Intercambiar por un nuevo token de acceso es el caso de uso más común, tomaremos este como ejemplo. No limitado a token de acceso, el intercambio de tokens también se puede utilizar para emitir otros tipos de tokens, como token de actualización, token de ID, etc.

Aplicación cliente

Para realizar el intercambio de tokens, se requiere una aplicación cliente registrada con el servidor de autorización.

Y la aplicación cliente debe tener un subject_token antes de iniciar el flujo de intercambio de tokens, este token generalmente es otorgado por el servidor de autorización o el proveedor de identidad de terceros de confianza. Al tener este token, la aplicación cliente ahora puede ser "confiable" para intercambiar tokens sin la necesidad de las credenciales e interacción del usuario.

Solicitud de intercambio de tokens

El cliente envía una solicitud al endpoint de token del servidor de autorización para intercambiar un token existente. Esto incluye el subject_token (el token que se intercambia) y opcionalmente, la audiencia objetivo deseada, el alcance y el tipo de token.

  1. grant_type: REQUERIDO. El valor de este parámetro debe ser urn:ietf:params:oauth:grant-type:token-exchange, que indica que se está realizando un intercambio de tokens.
  2. subject_token: REQUERIDO. El PAT del usuario.
  3. subject_token_type: REQUERIDO. El tipo de token de seguridad proporcionado en el parámetro subject_token. Un valor común de este parámetro es urn:ietf:params:oauth:token-type:access_token, pero puede variar según el token que se intercambia.
  4. resource: OPCIONAL. El indicador de recurso, ayuda a especificar el recurso objetivo para el token de acceso.
  5. audience: OPCIONAL. La audiencia del token de acceso, indicando los destinatarios previstos del token, el servidor de autorización puede usar el valor de resource si no se especifica audience.
  6. scope: OPCIONAL. Los alcances solicitados.

Además, la solicitud debe incluir la información del cliente, que puede ser codificada como un encabezado de autenticación básica o enviada como datos de formulario.

Aquí hay un ejemplo de solicitud:

Intercambio de tokens en Logto

Logto soporta el intercambio de tokens de manera nativa, incluyendo suplantación y tokens de acceso personal.