Saltar al contenido principal
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.

Paso 4 - Usar varios roles con Amazon API Gateway

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.

Paso 1. Cree el recurso de API PetPurchase

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);
};
Una vez que haya definido la función Lambda, agregue un método POST al recurso purchase que invoque la Lambda PetPurchase. Asegúrese también de agregar el encabezado Access-Control-Allow-Origin con un valor de * al método POST mediante la configuración de la respuesta del método y la respuesta de integración que se describe en la sección Configurar CORS e implementar la API del paso 2: proteger e implementar Amazon API Gateway. Pruebe el método de API Gateway y proporcione lo siguiente como mensaje de entrada:
{
    "petId": 1,
    "userName": "fred flintstone"
 }
En la respuesta de prueba, debería ver que la mascota con ID 1 ahora se vendió a Fred Flintstone:
[
  {
    "id": 1,
    "price": 249.99,
    "type": "dog",
    "isSold": true,
    "soldTo": "fred flintstone"
  },

  ...

Paso 2. Use IAM para proteger la API de PurchasePet

Actualiza IAM

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í:
arn:aws:execute-api:us-east-1:your-accountid:your-api-id/*/pets/purchase
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

Configura Login with Amazon y actualiza Auth0

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.
  1. Ve a Auth0 Dashboard > Authentication > Social y selecciona Create Connection.
  2. Elige la conexión que quieres configurar y da tu consentimiento.
  3. 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.
  4. 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:
<button ng-show="isAdmin" class="btn delete-btn" ng-click="removePet(pet.id)">remove</button>
Después de copiar los cambios en su bucket de S3, intente eliminar una mascota mientras tiene iniciada sesión como usuario social.
Actualice la lógica del controlador Home para permitir que los usuarios de redes sociales compren mascotas
En home.js, modifique la función buyPet para permitir la compra de mascotas:
function buyPet(user, id) {
    var apigClient = getSecureApiClient();

    apigClient.petsPurchasePost({},{userName:user, petId:id})
      .then(function(response) {
        console.log(response);
        $scope.pets = response.data;
        $scope.$apply();
      }).catch(function (response) {
        alert('buy pets failed');
        showError(response);
    });
}

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.

Forzar la asignación de roles con Auth0 Rules

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.

Forzar la asignación de roles

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.
  1. Vaya a Auth0 Dashboard > Auth Pipeline > Rules y seleccione Create Rule.
  2. Elija la plantilla Empty rule
  3. 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.

Advertencias

  • 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.

Depure su Rule

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.