Esta funcionalidad usa delegación. De forma predeterminada, la delegación está deshabilitada para los inquilinos que no usaban ningún complemento a fecha del 8 de junio de 2017. Los inquilinos heredados que actualmente usan un complemento que requiere delegación pueden seguir usando esta funcionalidad. Si en algún momento la funcionalidad de delegación cambia o se elimina del servicio, se notificará con antelación a los clientes que la usan actualmente y se les dará tiempo suficiente para migrar. Además, tenga en cuenta que la delegación no admite el uso de dominios personalizados, por lo que cualquier funcionalidad que dependa de ella puede no funcionar por completo junto con un dominio personalizado.
En este paso, asignarás distintos roles de AWS IAM a los usuarios en función de la información de autenticación:
Los usuarios que se autentiquen con conexiones sociales se tratarán como compradores;
Los usuarios que se autentiquen con conexiones de base de datos se tratarán como administradores.
Implementarás esta lógica de asignación de roles de dos maneras diferentes:
JavaScript;
Rules de Auth0.
En muchas aplicaciones de Auth0, querrás que distintos usuarios tengan diferentes niveles de acceso y usar información adicional sobre una identidad determinada en la lógica de tu servicio. En los casos en los que baste con restringir el acceso a nivel de API, puedes usar distintos roles de AWS IAM (por ejemplo, los administradores pueden usar la función de actualización para agregar y eliminar mascotas, mientras que los usuarios de conexiones sociales solo pueden comprar mascotas).El siguiente diagrama ilustra las asignaciones de roles de AWS IAM para dos clases diferentes de usuarios: usuarios autenticados mediante conexiones sociales y usuarios autenticados mediante conexiones de base de datos. También ilustra que los roles de AWS IAM pueden asignarse a otras entidades, como las funciones de AWS Lambda, para controlar los permisos que se asignan a esas entidades en una cuenta. En resumen, un rol de IAM es un conjunto de permisos sobre capacidades de AWS que se define mediante una o varias políticas y luego se asigna a una entidad.En los casos en los que quieras tomar decisiones dentro de tu código (por ejemplo, quizá quieras realizar una verificación de crédito de un usuario que compra una mascota), también querrás transmitir la identidad. Esto se mostrará a continuación en Paso 5 - Uso de tokens de identidad para transmitir la identidad.
En la Amazon API Gateway Console, seleccione su API de Pets. Se le dirigirá a la página Resources.Haga clic en Actions y luego en Create Resource. Asigne al New Child Resource el nombre Purchase. Haga clic en Create Resource.Agregue un método OPTIONS para el recurso purchase, como se describió anteriormente para pets en la sección Set Up Cors and Deploy the API del Paso 2 - Securing and Deploying the Amazon API Gateway.Cree una nueva función de AWS Lambda para la compra de una mascota llamada PetPurchase, que agrega los atributos isSold y soldTo a una mascota de la siguiente manera:
var AWS = require('aws-sdk');var DOC = require('dynamodb-doc');var dynamo = new DOC.DynamoDB();exports.handler = function(event, context) { var petId = event.petId; var user = event.userName; var pets = {}; console.log('start PetsPurchase, petId', petId, ' userName', user); var writecb = function(err, data) { if(!err) { context.done(null, pets); } else { console.log('error on GetPetsInfo: ',err); context.done('failed on update', null); } }; var readcb = function(err, data) { if(err) { console.log('error on GetPetsInfo: ',err); context.done('failed to retrieve pet information', null); } else { // verificar que tenemos mascotas if(data.Item && data.Item.pets) { pets = data.Item.pets; var found = false; for(var i = 0; i < pets.length && !found; i++) { if(pets[i].id === petId) { if(!pets[i].isSold) { pets[i].isSold = true; pets[i].soldTo = user; var item = { username:"default",pets: pets}; dynamo.putItem({TableName:"Pets", Item:item}, writecb); found = true; } } } if(!found) { console.log('pet not found'); context.done('That pet is not available.', null); } } else { console.log('pet already sold'); context.done('That pet is not available.', null); } } }; dynamo.getItem({TableName:"Pets", Key:{username:"default"}}, readcb);};
Para proteger tu API, sigue el mismo proceso para agregar un nuevo rol que seguiste en la Parte 2 de este tutorial. Asigna al nuevo rol el nombre auth0-api-social-role.El ARN del método que vas a proteger en la política de IAM debería verse más o menos así:
Asegúrate de actualizar también la política de confianza.Ve a la Amazon API Gateway Console y selecciona el método POST para el recurso /pets/purchase. Selecciona Method Request y cambia Authorization Type a AWS_IAM. Haz clic en la marca de verificación para guardar la configuración.En este punto, has definido dos roles que puedes usar con API Gateway:
auth0-api-role: permite actualizar mascotas
auth0-api-social-role: permite comprar una mascota
Puedes crear un rol social con Login with Amazon (LWA).Aunque este tutorial incluye instrucciones para usar Login with Amazon, ten en cuenta que también puedes usar otros proveedores sociales.
Elige la conexión que quieres configurar y da tu consentimiento.
Copia y pega el Client ID y el Secreto del cliente de tu proveedor de identidad social, selecciona los Attributes (y Permissions, cuando corresponda) y haz clic en Save.
Selecciona la vista Applications, habilita el interruptor de cada una de tus aplicaciones de Auth0 que deban poder usar esta conexión y selecciona Save.
Una vez que hayas introducido la información correspondiente, selecciona Try Connection para asegurarte de que todo esté configurado correctamente.Cuando configures LWA desde la consola de Amazon, asegúrate de introducir en Allowed Return URLs la URL de callback de tu aplicación de Auth0, que debería ser similar a https://johndoe.auth0.com/login/callback. La página de ayuda de Auth0 te mostrará exactamente qué debes introducir.Ve a Auth0 Dashboard > Applications > Applications y selecciona tu aplicación para ver su configuración. Selecciona la vista Connections, localiza la sección Social y asegúrate de que Amazon esté habilitado.
Implementa la API y actualiza la aplicación de página única
Implementar la API
Desde la Amazon API Gateway Console, vuelve a implementar la API y generar un nuevo SDK de JavaScript.En este punto, ya realizaste los cambios de configuración necesarios para habilitar la compra de mascotas. Para llevar esto a producción, copia el SDK que acabas de descargar y reemplaza el anterior tanto en tu carpeta pets como en tu bucket de Amazon S3.
Actualiza la lógica del controlador de Login para elegir roles distintos para diferentes tipos de usuarios
La lógica del controlador de Login usa getOptionsForRole para seleccionar roles distintos para diferentes usuarios. Cuando obtienes el token de delegación, puedes indicarle a Auth0 qué rol debe usar (es decir, si el usuario es administrador o no).En el archivo pets/login/login.js, modifica los valores de role y principal del usuario no administrador para usar el rol de IAM para usuarios sociales que acabas de crear.En este punto, deberías poder iniciar sesión con credenciales de Amazon o con el usuario de base de datos que creaste anteriormente. Ten en cuenta que la IU permite que un usuario social compre mascotas, mientras que un usuario administrador puede agregarlas y eliminarlas.Para probar esta funcionalidad, puedes ocultar temporalmente el botón para eliminar en la IU quitando ng-show="isAdmin" de /pets/home/home.html:
Copia el código a tu bucket de S3, cierra sesión y luego vuelve a iniciar sesión como usuario social haciendo clic en el icono de Amazon en el cuadro de diálogo de Login de Lock. Es posible que debas hacer clic en SHOW ALL si tu sesión anterior sigue activa en el panel de Lock.Ten en cuenta que, como usuario de Amazon, puedes comprar una mascota, pero no agregar ni eliminar mascotas. Sin embargo, si inicias sesión con un usuario asociado a una Conexión de base de datos, puedes agregar y eliminar mascotas, pero no comprarlas.
En algunos casos, puede determinar el rol adecuado mediante la aplicación (como se muestra aquí), pero por motivos de seguridad (por ejemplo, para evitar que el usuario asuma un rol con más privilegios de los necesarios), quizá le convenga determinar los privilegios del usuario en el servidor.Con Auth0, esto se hace mediante Rules, que son instrucciones de lógica de servicio que usted define y que luego se ejecutan durante el proceso de autenticación de Auth0. Por ejemplo, podría crear Rules para:
Evitar el envío de información de roles desde el navegador a la aplicación;
Insertar información de roles en la solicitud de delegación según la fuente de autenticación.
Añadirá una Rule para comprobar si el rol solicitado por el usuario está permitido, en función de su asociación con una conexión social o de base de datos.
Asigne a la Rule el nombre AWS Pets (o algo similar) y, a continuación, complete el cuerpo de la Rule con el siguiente código JavaScript:
Asegúrese de ajustar el código anterior con los valores correctos para su integración. Los campos son Princial ARN, Role ARN y Secreto del cliente.
4. Guarde los cambios.
Las Rules se ejecutan con alcance global en cada autenticación. Solo debe ejecutar la lógica en las solicitudes de autenticación asociadas a una aplicación determinada (por eso el script utilizado solicita el clientID). Sin esta información, la lógica se ejecutará en todas las solicitudes de autenticación asociadas a su cuenta de Auth0.
La información se pasa a la Rule mediante context y user.
Puede ampliar los objetos que se pasan a la Rule. En el código anterior, la Rule comprueba el cuerpo de la solicitud para obtener la información del rol. El rol se establece en la addonConfiguration de context para el rol permitido, que siempre prevalece sobre la configuración del cuerpo de la solicitud.
Ya está listo para depurar su Rule. Seleccione Try this Rule y se le mostrará un script que pone a prueba la lógica de la Rule. Seleccione Try.A continuación, se le mostrará el resultado de ejecutar su Rule.