OAuth2 JWT Encryption para tokens con ámbitos a múltiples servidores de recursos

2

Dentro del contexto de una implementación de OAuth2, me gustaría otorgarle a un Cliente un JWT encriptado que tenga un alcance para varios servidores de recursos y que cada servidor de recursos pueda descifrar independientemente del servidor de autorización que comparte un secreto entre todos los servidores de recursos.

¿Existen especificaciones para resolver este escenario?

Los requisitos en la siguiente sección especifican algunas restricciones restantes.

Requisitos

  • El descifrado debe ocurrir en la capa del Servidor de recursos, sin tener que volver a enviar el token a un Servidor de autorización (a través del punto final de introspección del token, o de otro modo).
  • Los Servidores de recursos deben tener claves secretas distintas para limitar la superficie de ataque que podría resultar en que se comprometa cualquier clave secreta.
  • El JWT debe usar el formato compacto para seguir siendo compatible con OpenID Connect (¿es esto cierto, o puede OpenID Connect funcionar con los formatos de serialización JSON JWT (JWS / JWE)?)

Un caso de uso de ejemplo

Trazaré un caso de uso para la concesión de código de autorización ( enlace ) para demostrar mi caso de uso.

  • Como usuario registrado de un servidor de autorización
  • Cuando visito una aplicación de cliente OAuth2 registrada (con mi agente de usuario) por primera vez
  • Luego debería ser redirigido al Servidor de Autorización con los parámetros de consulta requeridos para la concesión del Código de Autorización (incluyendo scopes="photos.read, photos.write, friends.read")
  • Y debería ver un cuadro de diálogo de autorización que solicita acceso delegado a los siguientes servicios:

    • Lee tus fotos
    • Sube fotos en tu nombre
    • Lee a tus amigos
  • Cuando hago clic en 'Autorizar'

  • Luego, debería ser redirigido de nuevo a la aplicación de cliente OAuth2 registrada con un código de autorización
  • Cuando el sistema de aplicación cliente OAuth2 usó el código de autorización para solicitar un token
  • Luego, el sistema de aplicación cliente OAuth2 debería recibir un token con los siguientes ámbitos:

    • photos.read
    • photos.write
    • friends.read

(...)

En mi implementación de este sistema, el "Recurso de fotos" y el "Recurso de amigos" viven en dos servidores de recursos distintos. Como se mencionó anteriormente, el objetivo es que estos servidores de recursos no compartan claves secretas idénticas.

Posible solución

  1. JWE JSON Serialización con múltiples destinatarios ( enlace ). Esto infringe los requisitos anteriores, ya que utiliza el método de serialización JWE JSON en lugar del formato compacto JWE. Según la pregunta anterior, parece que OpenID Connect solo puede usar el formato compacto de JWT. Si mi suposición es incorrecta aquí, ¿tal vez esta sea una solución razonable?

Gracias por leer esto. Realmente agradecería cualquier sugerencia o sugerencia.

    
pregunta Will Sulzer 12.04.2016 - 09:59
fuente

1 respuesta

3

Leí su pregunta un par de veces porque me enfrenté a un "problema" como el suyo. La solución presentada por usted, utilizando OAuth2 con OpenID Connect y JWT como token es correcta. Escribí en Medium un artículo donde describí en detalle cómo utilizar OAuth2 con OpenID Connect. Si tiene alguna pregunta, por favor pregúnteme.

EDICIÓN POSTERIOR

Una de las debilidades de OAuth2 es que no hay una forma prescrita para que el servidor de recursos valide el token de acceso o use el token de acceso para establecer la identidad del usuario.

Google y otros proveedores de OAuth2 resolvieron este problema al proporcionar un punto final de TokenInfo. Los servidores de recursos podrían pasar el token de acceso a este punto final y obtener información sobre la validez del token, la identidad del usuario, el alcance del token y el tiempo de caducidad. En mi caso, este punto final corresponde con el Servidor de autorización.

EsteconceptoseexpandióenOpenIDConnectconlaintroduccióndeltokendeID.Eltokendeidentificaciónesuntokenfirmadoypotencialmenteencriptadoquecontienelaidentidaddelusuarioycualquierreclamoqueestuvieradentrodelalcance.

EltokendeIDesuntokenwebJSON(JWT)quecontienedatosdeidentidad.ElClienteloconsumeyloutilizaparaobtenerinformacióndelusuariocomoelnombredelusuario,elcorreoelectrónico,etc.Estotambiénesútilcuandotieneunacadenadeservidoresderecursosyunservidorderecursospuedeserunclientedeotroservidorderecursos.

LafunciónJWTbrindaalasaplicacionesclienteylosservidoresderecursoslacapacidaddeobtenerinformaciónsegurasobreelusuariodirectamentesintenerquecontactaralservidordeautorizacióncadavez.

Si desea evitar la emisión de tokens de acceso demasiado amplio, puede realizar una verificación de autorización en cada punto de la cadena. Un servidor de recursos puede ser un cliente para el servidor de autorización, presentar su JWT y solicitar un nuevo JWT para el siguiente servidor de recursos de la cadena.

    
respondido por el Mihaila Adrian 29.12.2017 - 15:43
fuente

Lea otras preguntas en las etiquetas