- La clave pública del cliente (
jwk). - La carga útil que hace referencia a la solicitud del token de acceso, incluido el método (
htm) y el URI (htu). - Una firma creada con la clave privada del cliente.
- Un ID único (
jti) para evitar ataques de repetición. - Para cada solicitud a la API, un hash SHA-256 (
ath) del token de acceso codificado en base64url. - Opcional: Para , un claim
noncepara garantizar que la aplicación cliente haya generado recientemente el JWT de prueba de DPoP.
Casos de uso comunes
- Aplicaciones de página única (SPA) y aplicaciones móviles: Como clientes públicos, las SPA y las aplicaciones móviles carecen de un entorno confiable y confidencial, como el de un servidor backend, para almacenar de forma segura , lo que las hace vulnerables al robo de tokens. DPoP aborda esta vulnerabilidad de seguridad vinculando los tokens de acceso a la clave pública de la aplicación cliente y creando un JWT de prueba de DPoP. La aplicación cliente firma el JWT de prueba de DPoP con su clave privada y lo envía en una solicitud de autorización. El Servidor de autorización de Auth0 valida el JWT de prueba de DPoP y, si es válido, vincula el token de acceso emitido a la clave pública del cliente.
- Integraciones con API de terceros: Si un agente de IA integrado con su aplicación cliente llama a una API de terceros en nombre del usuario mediante un JWT de prueba de DPoP, entonces el puede validar criptográficamente que la solicitud proviene del agente de IA y no de un tercero no autorizado.
Tipos de concesión de aplicación compatibles
| Tipo de concesión | Descripción |
|---|---|
authorization_code | Concesión de código de autorización |
client_credentials | Concesión de credenciales de cliente |
password | Concesión de contraseña del propietario del recurso |
refresh_token | Concesión de Token de actualización |
urn:ietf:params:oauth:grant-type:device_code | Concesión de autorización de dispositivo |
http://auth0.com/oauth/grant-type/password-realm | Utiliza una concesión de extensión similar a la concesión de contraseña del propietario del recurso que incluye la capacidad de indicar un realm específico |
http://auth0.com/oauth/grant-type/passwordless/otp | Solicitud de concesión sin contraseña |
http://auth0.com/oauth/grant-type/mfa-oob | Solicitud de concesión OOB de Autenticación multifactor |
http://auth0.com/oauth/grant-type/mfa-otp | Solicitud de concesión OTP de Autenticación multifactor |
http://auth0.com/oauth/grant-type/mfa-recovery-code | Solicitud de concesión de código de recuperación de Autenticación multifactor |
urn:ietf:params:oauth:grant-type:token-exchange | Solicitud de concesión de Custom Token Exchange |
urn:okta:params:oauth:grant-type:webauthn | Solicitud de concesión de WebAuthn |
Cómo funciona

- Al solicitar un token de acceso al Servidor de autorización de Auth0, la aplicación cliente genera un par de claves criptográficas único y usa la clave pública para demostrar que posee la clave privada.
- La aplicación cliente genera el JWT de prueba de DPoP y lo envía al endpoint /token del Servidor de autorización de Auth0.
- El Servidor de autorización de Auth0 verifica el JWT de prueba de DPoP y, si es válido, emite el token de acceso y lo vincula a la clave pública del cliente.
- Antes de llamar a la API del cliente, la aplicación cliente genera un nuevo JWT de prueba de DPoP para demostrar que posee la clave privada asociada al token. La aplicación cliente envía el JWT de prueba de DPoP y el token de acceso restringido al remitente al servidor de recursos.
- El servidor de recursos verifica el JWT de prueba de DPoP, lo que garantiza que solo el propietario legítimo del token, o la aplicación cliente original, pueda usarlo para acceder correctamente a recursos protegidos. Para solicitar un token de acceso a partir de un token de actualización, la aplicación cliente genera un nuevo JWT de prueba de DPoP, lo que garantiza que el token de actualización quede vinculado a la clave pública del cliente.
Aplicar restricción del remitente a los tokens mediante DPoP en Auth0

- Requisitos previos
- Paso 1: La aplicación cliente genera un par de claves de DPoP
- Paso 2: La aplicación cliente crea un JWT de prueba de DPoP
- Paso 3: La aplicación cliente solicita un token vinculado a DPoP
- Paso 4: El Servidor de autorización de Auth0 valida el JWT de prueba de DPoP
- Paso 5: La aplicación cliente llama a la API con el token vinculado a DPoP y el JWT de prueba de DPoP
- Paso 6: Gestionar la renovación de tokens con DPoP
Requisitos previos
- Configurar la restricción del remitente para tu aplicación cliente y tu servidor de recursos.
Paso 1: La aplicación cliente genera un par de claves DPoP
Paso 2: La aplicación cliente crea un JWT de prueba de DPoP
/token del Servidor de autorización de Auth0, tu aplicación cliente debe crear un JWT de prueba de DPoP. Un JWT de prueba de DPoP es un JSON Web Token (JWT) firmado con la clave privada de tu cliente que actúa como la «prueba de posesión».
El JWT de prueba de DPoP consta de un encabezado JWT y una carga útil que contiene claim vinculadas a la solicitud del token:
claim del encabezado del JWT
| Claim de prueba JWT de DPoP | Descripción |
|---|---|
typ | Se establece en dpop+jwt. |
alg | El algoritmo de firma asimétrica utilizado, como RS256 o ES256. |
jwk | Una representación de JSON Web Key (JWK) de la clave pública de su cliente. |
claim de la carga útil del JWT
| Claim del JWT de prueba de DPoP | Descripción |
|---|---|
jti | Un identificador único del JWT para evitar ataques de repetición. |
htm | El método HTTP de la solicitud para la que se genera la prueba DPoP, como POST para solicitudes de token y GET para llamadas a la API. |
htu | El URI HTTP de la solicitud para la que se genera el JWT de prueba de DPoP, sin el fragmento ni los parámetros de consulta. Por ejemplo: https://api.example.com/data?param=1#section1 pasa a ser https://api.example.com/data. |
iat | La marca de tiempo de creación del JWT. |
ath | Para llamadas a la API con un token de acceso, un hash SHA-256 del token de acceso codificado en base64url. |
nonce | Para clientes públicos que requieren un nonce, un valor nonce proporcionado por el servidor. |
Paso 3: La aplicación cliente solicita un token vinculado a DPoP
/token del Servidor de autorización de Auth0, incluye la prueba JWT de DPoP en el encabezado HTTP de la solicitud:
- Rellena el encabezado HTTP DPoP con un JWT de prueba de DPoP firmado.
- Envía el encabezado HTTP DPoP con un JWT de prueba de DPoP firmado en una solicitud de token de acceso al endpoint
/token. - Procesa la respuesta del Servidor de autorización de Auth0.
Clientes públicos
/token y no incluye un valor nonce en el encabezado HTTP DPoP, Auth0 responde con un código HTTP 400 y un mensaje de error como el siguiente:
DPoP-Nonce en los encabezados de respuesta. Esto sigue el flujo estándar de “desafío-respuesta” definido en la especificación de DPoP. Debe usar el valor del encabezado DPoP-Nonce y volver a generar la prueba DPoP (como en el Paso 2), incluir un claim nonce con ese valor y volver a enviar la solicitud al endpoint /token.
El siguiente ejemplo de código muestra el flujo completo al realizar y luego reintentar una solicitud a /token con un claim nonce desde un cliente público:
- Extrae el JWT de prueba de DPoP, su clave pública y la firma.
- Verifica la firma con la clave pública proporcionada.
- Valida los claim
htm,htu,jti,eiat. - Si es válido, emite un token de acceso. El Servidor de autorización de Auth0 incluye un claim de confirmación,
cnf, en el token de acceso. El claimcnfcontiene la huella digital (hash) de la clave pública extraída del JWT de prueba de DPoP. Al incluirlo en el token de acceso, el Servidor de autorización de Auth0 vincula el token de acceso a esa clave pública concreta, es decir, restringe su uso al poseedor de esa clave. - Establece
token_typeen el encabezadoAuthorizationcomoDPoPen lugar deBeareren la respuesta del token. Tradicionalmente, cuando el token de acceso se envía en el encabezadoAuthorization, se establece comoBearer. Sin embargo, como aquí se envía un token de acceso vinculado a una clave pública mediante DPoP, se establece comoDPoP. - A continuación, el Servidor de autorización de Auth0 emite el token de acceso restringido al remitente mediante DPoP para tu aplicación cliente.
Paso 5: La aplicación cliente llama a la API con el token vinculado a DPoP y el JWT de prueba de DPoP
- Genera un nuevo JWT de prueba de DPoP con los siguientes claim:
- El claim
htmes el métodoHTTPde la solicitud a la API, comoGEToPOST. - El claim
htues el URI de la solicitud a la API. - El claim
athes el hash SHA-256 codificado en base64url del token de acceso vinculado a DPoP que recibió en el Paso 3.
- Firma criptográficamente el nuevo JWT de prueba de DPoP con la clave privada del cliente.
-
Incluye el token de acceso vinculado a DPoP en el encabezado
Authorizationmediante el esquema de autenticaciónDPoP:
- Incluye el JWT de prueba de DPoP recién generado en el encabezado HTTP
DPoP:
DPoP debe incluir un claim ath adicional. El claim ath es un hash SHA256 del token de acceso emitido, codificado en base64url.
El servidor de recursos:
- Recibe la solicitud a la API y extrae el token de acceso, la prueba JWT de DPoP, la clave pública y la firma.
- Verifica la firma de la prueba JWT de DPoP con la clave pública de su encabezado
jwk. - Valida los claim
htm,htu,jti,iatyath. - Verifica que la clave pública indicada en la prueba JWT de DPoP a través de su encabezado
jwkcoincida con la clave pública asociada al token de acceso mediante el claimcnf.jktdel token de acceso.
/userinfo con un token de acceso vinculado a DPoP:
Paso 6: Gestionar la renovación de tokens con DPoP
- Realiza una solicitud de token de actualización al endpoint
/tokendel Servidor de autorización de Auth0. - Genera un JWT de prueba de DPoP para la solicitud de token de actualización (similar al Paso 2, con
htmcomoPOSTyhtucomo el URI del ). - Incluye el JWT de prueba de DPoP en el encabezado HTTP
DPoP.
- Valida el JWT de prueba de DPoP (como en el Paso 4) y emite un nuevo token de acceso vinculado a DPoP.
Consideraciones importantes
- Seguridad de la clave privada: La seguridad de su implementación de DPoP depende de la seguridad de la clave privada de su cliente, por lo que debe protegerla del acceso no autorizado. Las claves privadas deben generarse y almacenarse en un medio con respaldo de hardware y marcarse como no exportables.
- Protección contra ataques de repetición (
jti** ydpop-nonce):** El claimjtidel JWT de prueba de DPoP ayuda a prevenir ataques de repetición en recursos protegidos, como el endpoint/userinfo. Actualmente, el Servidor de autorización de Auth0 no comprueba la reutilización dejtien el endpoint/userinfo. El Servidor de autorización de Auth0 emite un encabezado HTTPDPoP-Nonceen la respuesta, que los clientes públicos deben incluir como claimnonceen los JWT de prueba de DPoP posteriores para reforzar la protección contra ataques de repetición. - Límites de frecuencia: Como el flujo de desafío-respuesta de DPoP a veces puede requerir una solicitud inicial seguida de un reintento con el nonce proporcionado por el servidor, cada intercambio cuenta en la práctica como dos solicitudes para los límites de frecuencia de su tenant de Auth0. Asegúrese de que el volumen de solicitudes de su aplicación contemple esta sobrecarga.
- Manejo de errores: Usted es responsable de implementar la lógica para manejar errores específicos de DPoP del Servidor de autorización de Auth0 o del servidor de recursos, como
invalid_dpop_proofouse_dpop_nonce. - Tipos de cliente: Use DPoP para clientes públicos, como Single Page Applications (SPA) o aplicaciones móviles que no pueden almacenar de forma segura un Secreto del cliente. Para , como los servicios backend con secretos del cliente, DPoP añade una capa adicional de seguridad, pero ya cuentan con otros mecanismos para restringir el remitente.
- Rendimiento: Dado que generar y firmar JWT de prueba de DPoP para cada llamada a la API añade una pequeña sobrecarga, asegúrese de que las operaciones criptográficas de su aplicación cliente sean eficientes.
- Rotación de claves: Implemente una estrategia para rotar sus pares de claves de DPoP y así mejorar la seguridad. Asegúrese de usar el mismo par de claves durante la misma sesión.
- Persistencia: En las aplicaciones cliente que necesitan mantener una sesión y reutilizar tokens de acceso vinculados a DPoP, como las SPA de larga duración, conserve y recupere de forma segura el par de claves original entre recargas de la aplicación. Si se genera un nuevo par de claves o se usa uno diferente, el token de acceso vinculado a DPoP deja de ser válido, ya que está vinculado criptográficamente a la clave pública del par original. Puede conservar el par de claves, por ejemplo, en
IndexedDBdel navegador o en el almacenamiento seguro de una aplicación móvil.