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.