Soporte JWT de Flogo

Introducción a OAuth 2.0 y JWT

OAuth 2.0

OAuth 2.0 es un protocolo que permite a los usuarios autorizar a terceros a acceder a su información sin necesidad de conocer las credenciales del usuario. Generalmente, se basa en un sistema adicional que actúa como Proveedor de Identidad donde el usuario se va a autenticar, y una vez autenticado se le proporciona una pieza segura de información con los privilegios del usuario y puede usar esa pieza para autenticar sus solicitudes por un período de tiempo.

Muestra del Flujo de Autenticación OAuth v2.0

OAuth 2.0 también define una serie de flujos de concesión para adaptarse a diferentes necesidades de autenticación. Estas concesiones de autorización son las siguientes:

  • Credenciales del Cliente
  • Código de Autorización
  • Credenciales de Contraseña del Propietario del Recurso

La decisión de elegir un flujo u otro depende de las necesidades de la invocación y, por supuesto, es una decisión personal del cliente, pero de manera general, la aproximación mostrada en la documentación de Auth0 es la recomendación habitual:

Gráfico de Decisión para elegir la Concesión de Autorización a usar

Estas concesiones se basan en JSON Web Token para transmitir información entre las diferentes partes.

JWT

JSON Web Token es un estándar de la industria para la generación de tokens definido en el estándar RFC 7519. Define una forma segura de enviar información entre partes como un objeto JSON.

Está compuesto por tres componentes (Encabezado, Carga Útil y Firma) y puede ser utilizado por un cifrado simétrico o con un modo de intercambio de clave pública/privada usando RSA o ECDSA.

Muestra de Composición de JWT

Escenario de Caso de Uso

Entonces, OAuth V2 y JWT son la forma habitual de autenticar solicitudes en el mundo de los Microservicios, por lo que es importante tener este estándar soportado en tu marco de trabajo, y esto está perfectamente cubierto en Flogo Enterprise como vamos a ver en esta prueba.

Configuración de AWS Cognito

Vamos a usar AWS Cognito como el Servidor de Autorización, ya que es bastante fácil de configurar y es uno de los principales actores en este tipo de autenticación. En palabras de Amazon:

Amazon Cognito te permite agregar registro de usuarios, inicio de sesión y control de acceso a tus aplicaciones web y móviles de manera rápida y sencilla. Amazon Cognito escala a millones de usuarios y admite inicio de sesión con proveedores de identidad social, como Facebook, Google y Amazon, y proveedores de identidad empresarial a través de SAML 2.0.

En nuestro caso, vamos a hacer una configuración bastante sencilla y los pasos a continuación se muestran a continuación:

  • Crear un Grupo de Usuarios llamado “Flogo”
  • Crear un Cliente de Aplicación con un secreto generado llamado “TestApplication”
  • Crear un Servidor de Recursos llamado “Test” con identificador “http://flogo.test1” y con un alcance llamado “echo”
Configuración del Servidor de Recursos
  • Establecer la siguiente Configuración del Cliente de Aplicación como se muestra en la imagen a continuación con los siguientes detalles:
  1. Grupo de Usuarios de Cognito seleccionado como Proveedor de Identidad Habilitado
  2. Credenciales del cliente utilizadas como Flujos de OAuth Permitidos
  3. http://flogo.test1/echo seleccionado como un alcance habilitado
Configuración del Cliente de Aplicación

Y eso es toda la configuración necesaria a nivel de Cognito, y ahora volvamos a la interfaz web de Flogo Enterprise.

Configuración de Flogo

Ahora, vamos a crear un Servicio REST y vamos a omitir todos los pasos sobre cómo crear un servicio REST usando Flogo, pero puedes echar un vistazo a los pasos detallados en el flujo a continuación:

Vamos a crear un servicio de eco alojado en localhost:9999/hello/ que recibe un parámetro de ruta después de hello que es el nombre que nos gustaría saludar, y vamos a establecer las siguientes restricciones:

  • Vamos a verificar la presencia de un Token JWT
  • Vamos a validar el Token JWT
  • Vamos a verificar que el JWT incluya el http://flogo.test1/echo

En caso de que todo esté bien, vamos a ejecutar el servicio, en caso de que no se cumpla algún requisito previo, vamos a devolver un error 401 No Autorizado.

Vamos a crear dos flujos:

  • Flujo principal que va a tener el Servicio REST
  • Subflujo para realizar todas las validaciones relacionadas con JWT.

El flujo principal es bastante sencillo, va a recibir la solicitud, ejecutar el subflujo y dependiendo de su salida va a ejecutar el servicio o no:

Entonces, toda la lógica importante está dentro del otro flujo que va a realizar toda la Validación JWT, y su estructura es la que se muestra a continuación:

Vamos a usar la actividad JWT alojada en GitHub disponible en el enlace que se muestra a continuación:

NOTA: Si no recuerdas cómo instalar una extensión de Flogo Enterprise, echa un vistazo al enlace a continuación:

Y después de eso, la configuración es bastante fácil, ya que la actividad te permite elegir la acción que deseas realizar con el token. En nuestro caso, “Verificar” y proporcionamos el token, el algoritmo (en nuestro caso “RS256”) y la clave pública que vamos a usar para validar la firma del token:

Prueba

Ahora, vamos a lanzar la Aplicación Flogo Enterprise desde el binario generado:

Y ahora, si intentamos hacer una ejecución al endpoint sin proporcionar ningún token obtenemos el código de respuesta 401 esperado

Entonces, para obtener el token de acceso, lo primero que necesitamos hacer es enviar una solicitud al endpoint de AWS Cognito (https://flogotest.auth.eu-west-2.amazoncognito.com/oauth2/token) usando nuestras credenciales de aplicación:

Y este token tiene toda la información del cliente y sus permisos, puedes verificarlo en la página web jwt.io:

Y para finalmente probarlo, solo necesitamos agregarlo a la primera solicitud que intentamos como podemos ver en la imagen a continuación:

Recursos

Alexandre Vazquez: