tutorial sub que issuer example bearer oauth oauth-2.0 jwt json-web-token

oauth - sub - token jwt bearer



Audiencia JWT(Json Web Token) “aud” versus Client_Id: ¿cuál es la diferencia? (2)

Estoy trabajando en la implementación de OAuth 2.0 JWT access_token en mi servidor de autenticación. Pero no tengo claro cuáles son las diferencias entre el reclamo JWT aud y el valor del encabezado HTTP client_id . ¿Son lo mismo? Si no, ¿puedes explicar la diferencia entre los dos?

aud que aud debería referirse a los servidores de recursos, y client_id debería referirse a una de las aplicaciones cliente reconocidas por el servidor de autenticación (es decir, la aplicación web o la aplicación iOS).

En mi caso actual, mi servidor de recursos también es mi cliente de aplicación web.


El reclamo JWT aud (Audiencia)

De acuerdo con RFC 7519 :

El reclamo "aud" (audiencia) identifica a los destinatarios para los que está destinado el JWT. Cada director que intente procesar el JWT DEBE identificarse con un valor en el reclamo de la audiencia. Si el principal que procesa el reclamo no se identifica con un valor en el reclamo "aud" cuando este reclamo está presente, entonces el JWT DEBE ser rechazado. En el caso general, el valor "aud" es una matriz de cadenas sensibles a mayúsculas y minúsculas, cada una de las cuales contiene un valor StringOrURI. En el caso especial cuando el JWT tiene una audiencia, el valor "aud" PUEDE ser una sola cadena sensible a mayúsculas y minúsculas que contenga un valor StringOrURI. La interpretación de los valores del público generalmente es específica de la aplicación. El uso de este reclamo es OPCIONAL.

El reclamo de audiencia ( aud ) según lo definido por la especificación es genérico y es específico de la aplicación. El uso previsto es identificar los destinatarios previstos del token. Lo que un destinatario quiere decir es específico de la aplicación. Un valor de audiencia es una lista de cadenas o puede ser una sola cadena si solo hay un reclamo de aud . El creador del token no exige que aud esté validado correctamente, es responsabilidad del destinatario determinar si se debe usar el token.

Cualquiera sea el valor, cuando un destinatario está validando el JWT y desea validar que el token fue diseñado para sus fines, DEBE determinar qué valor en aud identifica, y el token solo debe validar si la ID declarada del destinatario está presente en el reclamo de aud . No importa si se trata de una URL o alguna otra cadena específica de la aplicación. Por ejemplo, si mi sistema decide identificarse en aud con la cadena: api3.app.com , solo debería aceptar el JWT si el reclamo aud contiene api3.app.com en su lista de valores de audiencia.

Por supuesto, los destinatarios pueden optar por ignorar aud , por lo que esto solo es útil si un destinatario desea una validación positiva de que el token fue creado específicamente para él.

Mi interpretación basada en la especificación es que el reclamo de aud es útil para crear JWT diseñados específicamente que solo son válidos para ciertos propósitos. Para un sistema, esto puede significar que desea que un token sea válido para algunas funciones, pero no válido para otras. Podrías emitir tokens que estén restringidos solo a cierta "audiencia", mientras sigas usando las mismas claves y algoritmo de validación.

Como en el caso típico un JWT es generado por un servicio confiable y utilizado por otros sistemas confiables (sistemas que no quieren usar tokens inválidos), estos sistemas simplemente necesitan coordinar los valores que usarán.

Por supuesto, aud es completamente opcional y puede ignorarse si su caso de uso no lo justifica. Si no desea restringir el uso de tokens para audiencias específicas, o ninguno de sus sistemas realmente validará el token de aud , entonces es inútil.

Ejemplo: acceso frente a tokens de actualización

Un ejemplo ingenioso (pero simple) en el que puedo pensar es que tal vez queremos usar JWT para acceder y actualizar tokens sin tener que implementar claves de encriptación y algoritmos separados, pero simplemente queremos asegurarnos de que los tokens de acceso no se validen como tokens de actualización, o viceversa -versa.

Al usar aud , podemos especificar un reclamo de refresh para tokens de actualización y un reclamo de access para tokens de acceso al crear estos tokens. Cuando se realiza una solicitud para obtener un nuevo token de acceso de un token de actualización, debemos validar que el token de actualización era un token de actualización genuino. La validación de aud como se describió anteriormente nos dirá si el token era realmente un token de actualización válido al buscar específicamente un reclamo de refresh en aud .

OAuth Client ID vs. JWT aud Claim

El ID de cliente de OAuth no tiene ninguna relación y no tiene correlación directa con los reclamos de JWT aud . Desde la perspectiva de OAuth, los tokens son objetos opacos.

La aplicación que acepta estos tokens es responsable de analizar y validar el significado de estos tokens. No veo mucho valor al especificar el ID de cliente OAuth dentro de un reclamo de JWT aud .


Resulta que mis sospechas eran correctas. El reclamo de audiencia de audiencia en un JWT está destinado a referirse a los Servidores de Recursos que deberían aceptar el token.

Como this publicación simplemente lo pone:

La audiencia de un token es el destinatario previsto del token.

El valor de la audiencia es una cadena, generalmente, la dirección base del recurso al que se accede, como https://contoso.com .

client_id en OAuth se refiere a la aplicación cliente que solicitará recursos del servidor de recursos.

La aplicación Cliente (por ejemplo, su aplicación iOS) solicitará un JWT a su Servidor de autenticación. Al hacerlo, pasa su client_id y client_secret junto con las credenciales de usuario que puedan ser necesarias. El servidor de autorización valida al cliente utilizando client_id y client_secret y devuelve un JWT.

El JWT contendrá un reclamo de aud que especifica para qué Servidores de Recursos es válido el JWT. Si el aud contiene www.myfunwebapp.com , pero la aplicación cliente intenta usar el JWT en www.supersecretwebapp.com , entonces se denegará el acceso porque ese Servidor de recursos verá que el JWT no estaba destinado para ello.