Flujo de autenticación de varios participantes
Explora un ejemplo específico de un flujo de autenticación complejo y de varios participantes y aprende cómo Auth0 lo simplifica.
El problema
Cuando tu negocio depende de la rápida puesta en producción de tus aplicaciones personalizadas, necesitas una plataforma de IAM diseñada por desarrolladores, para desarrolladores. Veamos cómo Auth0 hace que incluso los flujos de trabajo de identidad más sofisticados sean fáciles de implementar, consiguiendo que tus aplicaciones entren en producción más rápidamente, de forma más segura y con menos mantenimiento continuo.
Imagina que estás creando “Lodging Picks”, una aplicación de viajes SaaS B2B que venderás a empresas. Agrega listados de alojamiento de múltiples fuentes, incluidos hoteles y RoomSMart, un mercado en línea muy similar a AirBnB que pone en contacto a anfitriones con habitaciones para alquilar con viajeros que buscan alojamiento económico en casa. El reto: reservar propiedades de RoomSMart a través de su API privada 1 en nombre de los usuarios de tus clientes, sin tener las credenciales de la cuenta de RoomSMart.
- Podríamos haber utilizado AirBnB como ejemplo, pero no queríamos dar a entender que ofrecen una API privada para uso de los socios. Piensa que RoomSMart es como AirBnB y que este caso de uso ilustra una situación realista de autenticación de varios participantes.
Los desafíos
¿Qué hace que este flujo de autenticación de varios participantes sea complejo de implementar? Veamos las preocupaciones de las partes implicadas en esta situación:
- La empresa desea aprovechar las ventajas de Lodging Picks para su negocio, pero debe controlar el acceso de sus empleados a la aplicación Lodging Picks y quiere que su uso sea sencillo. En consecuencia, la empresa desea integrar Lodging Picks en su infraestructura de SSO, y debe poder aprovisionar y desaprovisionar a los empleados para Lodging Picks a medida que se incorporan y abandonan la empresa.
- El empleado desea reservar alojamiento a través de la aplicación, incluidas las habitaciones RoomSMart, pero debe controlar el acceso a su cuenta de RoomSMart por parte de Lodging Picks. En particular, los usuarios que elijan alojamiento deben tener acceso limitado únicamente para reservar habitaciones utilizando el método de pago predeterminado de su cuenta, y no para puntuar a los anfitriones, enviar mensajes o cambiar el perfil o la información de pago. Además, debe poder revocar el acceso en caso de problema y mantener privado su perfil de RoomSMart.
- Lodging Picks quiere ofrecer un servicio valioso a sus clientes empresariales, con una gran experiencia de usuario SSO para usuarios empresariales y un nuevo canal para RoomSMart. Pero en un mundo en el que las brechas de seguridad son habituales noticias de portada, Lodging Picks debe intermediar en estas transacciones minimizando la confianza exigida a las partes participantes. A menos que todos se sientan seguros de que su valiosa información está a salvo y bajo su control, los riesgos de utilizar esta aplicación de SaaS podrían superar los beneficios.
- RoomSMart está deseando añadir un nuevo canal B2B a sus ventas. Pero han construido su negocio sobre la base de la confianza: los anfitriones ofrecen espacio en sus casas a desconocidos (huéspedes), y los huéspedes reservan esas habitaciones basándose tanto en las descripciones del sitio como en las valoraciones y comentarios de otros huéspedes. Tanto los anfitriones como los huéspedes guardan información sensible en el servicio, y RoomSMart debe mantener la privacidad y cumplir las leyes y normativas al tiempo que ofrece una experiencia de usuario muy sencilla. En consecuencia, es probable que no permitan que otras aplicaciones almacenen credenciales de inicio de sesión, que controlen estrictamente el acceso a la API, que den a los propietarios de la información sensible el control total y que conserven la capacidad de hacer cumplir sus condiciones de servicio.
Si esto parece complicado, ¡lo es! Pero también es típico de las aplicaciones web y móviles modernas construidas por la composición de servicios disponibles en la “economía de las API” a partir de fuentes independientes. La autenticación y la autorización son las herramientas críticas que rigen la forma en que estos servicios pueden confiar unos en otros en un entorno intrínsecamente poco fiable.
En la actualidad, no existe ninguna solución que gestione flujos de trabajo de autenticación sofisticados y de varios participantes como este. Las herramientas con flujos de autenticación integrados y sencillos no pueden hacerlo. Para implementar Lodging Picks, es posible que tengas que crear a mano una solución de IAM personalizada con un costo considerable, contratar a personal especializado y llevar a cabo un costoso mantenimiento continuo. Lo que realmente necesitas es una plataforma de identidad basada en API optimizada para la flexibilidad de los desarrolladores, que simplifique las aplicaciones en las que la identidad traspasa los límites de la organización. Necesitas Auth0.
La solución: Reglas de redireccionamiento de Auth0
¿Qué hay que hacer aquí? El usuario, un empleado de tu cliente, iniciará sesión en Lodging Picks utilizando sus credenciales empresariales federadas. Auth0 simplifica este proceso, facilitándote la implementación de SSO para tus clientes. Una vez autenticado el usuario, deberás ejecutar un flujo de trabajo de incorporación que permita a Lodging Picks utilizar la API de RoomSMart para ver y reservar alojamientos de RoomSMart en nombre del usuario.
¿Por qué no pedir al usuario que inicie sesión en Lodging Picks con sus credenciales de empresa y sus credenciales de RoomSMart y, a continuación, vincular las cuentas para que el usuario pueda utilizar cualquiera de ellas para acceder a Lodging Picks? Este enfoque no funcionaría: el usuario podría acceder a Lodging Picks incluso después de haber dejado de ser empleado de la empresa, utilizando sus datos de acceso a RoomSMart. El acceso a la aplicación Lodging Picks debe realizarse únicamente con la cuenta de empresa del empleado, a través de SSO.
¿Qué pasaría si pidieras al usuario que guardara su nombre y contraseña de RoomSMart en la aplicación Lodging Picks? Puede que funcione, pero va en contra de las prácticas recomendadas. Es mucho menos seguro tanto para RoomSMart como para el empleado, podría convertir a Lodging Picks en un objetivo de pirateo más atractivo y, en consecuencia, podría ser desautorizado por RoomSMart.
Entonces, ¿cómo puedes obtener únicamente el acceso que necesitas a RoomSMart en nombre del usuario, sin tener sus credenciales de RoomSMart y autenticándote únicamente con la cuenta de empresa del usuario?
Imagen 1: Canal de reglas Auth0
Auth0 incluye una poderosa característica (reglas de canalización de autenticación) que te permiten agregar código que se ejecuta después de cada autenticación para agregar procesamiento personalizado. Las reglas pueden incluir código arbitrario que podría registrar transacciones, vincularse a plataformas de análisis, iniciar autenticación adicional, como la autenticación multifactor, o llamar a API adicionales para acceder a información adicional o realizar trabajos adicionales. Las reglas pueden redirigir a los usuarios a sitios o servicios externos y, a su regreso, realizar un procesamiento adicional del resultado. Esta capacidad de añadir cualquier código al proceso de autenticación es una de las características más potentes de Auth0.
Con solo unas docenas de líneas de Javascript, puedes implementar incluso un complejo flujo de trabajo de autenticación de varios participantes y multiprotocolo, como el de Lodging Picks. Por lo tanto, implementaremos nuestro flujo de trabajo como una regla (el prototipo de código Javascript se encuentra en el Apéndice A, al final de este caso de uso). Cuando la regla detecta que Auth0 aún no ha guardado un token de actualización para RoomSMart, como cuando un usuario inicia sesión por primera vez en Lodging Picks, interrumpe el proceso de autenticación del usuario y lo redirige a la página de concesión de API de RoomSMart. A continuación, el usuario concede permiso a Auth0, en nombre de Lodging Picks, para adquirir y almacenar de forma segura un token de actualización de API específico del usuario en el perfil del usuario que, a su vez, puede utilizarse para adquirir un token de acceso con derechos de acceso limitados y caducidad breve. Lodging Picks puede llamar a la API de Auth0 para recuperar user.app_metadata_encrypted_roomsmart_refresh_token
y después de adquirir el token de acceso, realizar búsquedas y reservas en RoomSMart en nombre del usuario. El usuario conserva el control total y puede revocar este acceso en cualquier momento visitando su cuenta de RoomSMart. RoomSMart también puede revocar la actualización o el token de acceso. Otra regla podría utilizar automáticamente el token de actualización para adquirir un nuevo token de acceso antes de que caduque el antiguo.
Imagen 2: Ejemplo de flujo de trabajo de autenticación de varios participantes
Las reglas de redirección de Auth0 te permiten interrumpir el proceso de autenticación para llamar a cualquier servicio. No estás limitado al código que has escrito en tu aplicación. Con esta potente capacidad, puedes aprovechar el ecosistema de API web o crear integraciones personalizadas con aplicaciones empresariales.
Consulta la documentación completa y ejemplos de Auth0 para obtener más información sobre cómo implementar reglas de redirección, y echa un vistazo al Apéndice A para ver un prototipo de una regla que implementa este caso de uso específico.
La ejecución arbitraria de código significa que tienes la flexibilidad de componer flujos de trabajo complejos de autenticación y autorización, sin necesidad de crear y mantener una solución de IAM personalizada. Todo ello utilizando enlaces sencillos y el soporte completo de plataforma frontend y backend de Auth0 para acelerar el desarrollo.
Cuando llegue el momento de implementar tus aplicaciones nativas IOS y Android, tus desarrolladores pueden aprovechar este flujo de trabajo de identidad de producción sin ningún esfuerzo adicional, las aplicaciones móviles utilizan las mismas API de Auth0. ¡Fácil!
Conclusión
Las aplicaciones web y móviles modernas se componen de servicios llamados por API alojadas en empresas y entidades independientes. La seguridad en este ecosistema de API depende de la autenticación: los servicios deben saber que las llamadas a su API para acceder a información personal identificable y a acciones sensibles son legítimas y están aprobadas por los titulares de sus cuentas. A medida que las aplicaciones crecen en complejidad, los patrones de uso y los requisitos de acceso de estas API independientes no pueden predecirse de antemano ni integrarse en patrones de diseño rígidos. La economía de las API exige flexibilidad basada en el código para gestionar los flujos de autenticación. Las reglas de autenticación de Auth0 hacen que estos flujos personalizados sean fáciles de construir para los desarrolladores, y fáciles de navegar para los usuarios finales en estas situaciones donde se necesita autenticación de varios participantes.
Auth0 viene con otra característica única, su elogiado equipo de Éxito del cliente. La ayuda está a solo un chat de Slack o un correo electrónico de distancia, para que pueda superar rápidamente cualquier obstáculo y poner en producción sus aplicaciones críticas para la empresa.
Para obtener más información, contacta con el equipo de ventas de Auth0, ¡o, simplemente, pruébalo! Toda la capacidad de la plataforma de Auth0 es siempre gratuita para su uso en desarrollo. Crea tu cuenta gratuita hoy mismo en auth0.com y descubre la diferencia centrada en el desarrollador.
Apéndice A: Código del prototipo
A continuación, se muestra un ejemplo de código que implementa la regla descrita en este caso de uso. Obtiene un código de autorización a través del flujo de consentimiento de RoomSMart y, a continuación, intercambia dicho código por un token de actualización. Luego, la regla cifra ese token de actualización y lo guarda como metadatos de la aplicación en el perfil del usuario.
function(user, context, callback) {
// If we already have the user's refresh token, don't ask for consent again.
user.user_metadata = user.user_metadata || {};
if (user.app_metadata.encrypted_roomsmart_refresh_token) {
return callback(null, user, context);
}
var CLIENT_ID = '123456';
var CLIENT_SECRET = 'ABCDEFG';
// Redirigir a la aplicación web RoomSMart para solicitar el consentimiento.
if (context.protocol !== 'redirect-callback') {
var REDIRECT_TO = 'https://roomsmart.com';
var REDIRECT_PATH = '/oauth2/authorize?client_id=' + CLIENT_ID +
'&redirect_uri=http://lodgingpicks.auth0.com/continue&response_type=code' +
'&scope=offline_access%20read_account';
context.redirect = {
url: REDIRECT_TO + REDIRECT_PATH
};
return callback(null, user, context);
}
// Nos redirigimos de vuelta.
else {
// No consent given.
if (context.request.query.error) {
return callback(new UnauthorizedError(context.request.query.error_description));
}
// Consentimiento dado, intercambiar el código de autorización por tokens
var token_request = {
body: 'grant_type=authorization_code' +
'&client_id=' + CLIENT_ID +
'&client_secret=' + CLIENT_SECRET +
'&redirect_uri=http://lodgingpicks.auth0.com/continue' +
'&code=' + context.request.query.code
};
request.post('https://roomsmart.com/oauth2/token', token_request, function(err, res, body) {
if (err) {
return callback(err);
}
var token_response = JSON.parse(body);
if (!token_response.refresh_token) {
return callback(new UnauthorizedError('Refresh token is missing'));
}
// Cifrar el token de actualización.
user.app_metadata.encrypted_roomsmart_refresh_token = encrypt(token_response.refresh_token);
// Almacenar en el perfil del usuario.
auth0.users.updateAppMetadata(user.user_id, user.app_metadata)
.then(function() {
// Continue the authentication transaction.
callback(null, user, context);
})
.catch(function(err) {
callback(err);
});
});
}
// Ayudante para cifrar datos sensibles.
function encrypt(data) {
var iv = new Buffer(configuration.ENCRYPT_IV);
var decodeKey = crypto.createHash('sha256')
.update(configuration.ENCRYPT_PASSWORD, 'utf-8').digest();
var cipher = crypto.createCipheriv('aes-256-cbc', decodeKey, iv);
return cipher.update(JSON.stringify(data || {}), 'utf8', 'base64') + cipher.final('base64');
}
}
Regístrese gratis
Empiece a construir hoy mismo y proteja sus aplicaciones con la plataforma de identidad Auth0.