Tutoriel AWS API Gateway - Étape 4

Étape 4 - Utiliser plusieurs rôles avec Amazon API Gateway

Dans cette étape, vous attribuerez différents rôles AWS IAM aux utilisateurs en fonction des informations d’authentification :

  • Les utilisateurs s’authentifiant avec connexions sociales seront traités comme des acheteurs;

  • Les utilisateurs s’authentifiant avec les connexions de la base de données seront traités comme des administrateurs.

Vous exécuterez cette logique d’attribution de rôle de deux manières différentes :

  • JavaScript;

  • Règles d'Auth0

Pour de nombreuses applications Auth0, vous aurez besoin d’accorder à différents utilisateurs des niveaux d’accès distincts et de disposer d’informations supplémentaires concernant une identité spécifique à utiliser dans votre logique de service. Dans les situations où il s’agit simplement de restreindre l’accès au niveau de l’API, différents rôles AWS IAM peuvent être mis en œuvre (par exemple, les administrateurs peuvent utiliser la fonction de mise à jour pour ajouter ou supprimer des animaux de compagnie, tandis que les utilisateurs sociaux ne peuvent que les acheter).

Le diagramme ci-dessous présente les attributions de rôles AWS IAM pour deux catégories distinctes d’utilisateurs : ceux authentifiés via les connexions sociales et ceux authentifiés via les connexions de base de données. Il démontre également que les rôles AWS IAM peuvent être affectés à d’autres entités, telles que les fonctions AWS Lambda, afin de gérer les permissions qui leur sont accordées pour compte particulier. En résumé, un rôle IAM représente un ensemble d’autorisations sur les services AWS, défini par une ou plusieurs politiques, puis assigné à une entité.

Dans les situations où vous souhaitez prendre des décisions au sein de votre code (par exemple, vérifier la solvabilité d’un utilisateur achetant un animal de compagnie), il peut être nécessaire de transmettre également l’identité de l’utilisateur. Ceci sera démontré ci-dessous dans l’Étape 5 – Utilisation de jetons d’ID pour transmettre l’identité.

1. Créer la ressource API PetPurchase

En utilisant la Console de passerelle Amazon API, sélectionnez votre API Pets. Vous serez redirigé vers sa page Ressources.

Cliquez sur Actions et Créer une ressource. Nommez la nouvelle ressource enfant Purchase. Cliquez sur Créer une ressource.

Ajoutez une méthode OPTIONS pour la ressource purchase, comme indiqué précédemment pour les pets dans la Section Configurer CORS et déployer l’API de l’étape 2 - Sécuriser et déployer la passerelle API Amazon.

Créez une nouvelle fonction AWS Lambda pour l’achat d’un animal de compagnie appelé PetPurchase, ce qui ajoute les attributs isSold et soldTo à un animal de compagnie comme suit :

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 {
          // make sure we have pets
          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);
};

Was this helpful?

/

Une fois que vous avez défini la fonction Lambda, ajouter une méthode POST à la ressource purchase qui appelle le PetPurchase Lambda Assurez-vous d’ajouter également l’en-tête Access-Control-Allow-Origin avec une valeur de * à la méthode POST en utilisant la configuration de réponse de la méthode/réponse d’intégration que l’on trouve dans la Section Configurer CORS et déployer l’API de l’étape 2 - Sécuriser et déployer la passerelle API Amazon.

Testez la méthode de passerelle API en fournissant les éléments suivants comme message d’entrée :

{
    "petId": 1,
    "userName": "fred flintstone"
 }

Was this helpful?

/

Dans la réponse du test, vous devriez voir que l’animal de compagnie avec l’ID 1 est maintenant vendu à Fred Flintstone :

[
  {
    "id": 1,
    "price": 249.99,
    "type": "dog",
    "isSold": true,
    "soldTo": "fred flintstone"
  },

  ...

Was this helpful?

/

2. Utilisez IAM pour sécuriser l’API PurchasePet

Mettre à jour IAM

Pour sécuriser votre API, suivez le même processus que pour ajouter un nouveau rôle que vous avez effectué dans la partie 2 de ce tutoriel. Appeler le nouveau rôle auth0-api-social-role.

L’ARN de la méthode que vous sécuriserez dans la politique IAM devrait ressembler à ceci :

arn:aws:execute-api:us-east-1:your-accountid:your-api-id/*/pets/purchase

Was this helpful?

/

Assurez-vous également de mettre à jour la politique de confiance.

Accédez à Console de passerelle Amazon API, et sélectionnez la méthode POST pour la ressource /pets/purchase. Sélectionner Demande de méthode et changer Type d’autorisation à AWS_IAM. Cliquez sur la coche pour enregistrer le paramètre.

À ce stade, vous avez défini deux rôles que vous pouvez utiliser avec la passerelle API :

  • auth0-api-role : permet de mettre à jour les animaux de compagnie

  • auth0-api-social-role : permet d’acheter un animal de compagnie

Configurer la Connexion avec Amazon et mettre à jour Auth0

Vous pouvez créer un rôle social en utilisant la Connexion avec Amazon (LWA).

Bien que ce didacticiel inclue des instructions sur l’utilisation de la Connexion avec Amazon, veuillez noter que vous pouvez également utiliser d’autres fournisseurs sociaux.

  1. Accédez à Auth0 Dashboard > Authentification > Sociale et sélectionnez Créer une connexion.

  2. Sélectionnez la connexion que vous souhaitez configurer et consentez.

  3. Copiez et collez le Client ID et Client Secret à partir de votre fournisseur d’identité sociale, sélectionnez Attributs (et Autorisations, le cas échéant), et cliquez sur Enregistrer.

  4. Sélectionnez l’onglet Applications, activez la bascule pour chacune de vos applications Auth0 qui doivent pouvoir utiliser cette connexion, puis cliquez sur Enregistrer.

Une fois que vous avez saisi les informations appropriées, sélectionnez Essayer la connexion pour vous assurer que tout est correctement configuré.

Lorsque vous configurez LWA à l’aide de la console Amazon, assurez-vous de saisir dans les URL de retour autorisées l’URL de rappel à votre application Auth0, qui devrait ressembler à quelque chose comme https://pierreuntel.auth0.com/login/callback. La page d’aide Auth0 vous montrera spécifiquement ce que vous devez saisir.

Accédez à Auth0 Dashboard > Applications > Applications et sélectionnez votre application pour afficher ses paramètres. Sélectionnez Connexions voir, localiser la section Sociale, et assurez-vous que Amazon est activé.

Déployer l’API et mettre à jour l’application à une seule page

Déployer l’API

En utilisant la Console de passerelle Amazon API, vous allez à nouveau déployer l’API et générer une nouvelle trousse SDK JavaScript.

À ce stade, vous avez effectué les modifications de configuration nécessaires pour permettre les achats d’animaux de compagnie. Pour activer cette mise à jour, copiez votre trousse SDK nouvellement téléchargée sur le précédent dans votre dossier pets, ainsi que votre bucket Amazon S3.

Mettez à jour la logique du contrôleur de connexion afin de choisir des rôles différents pour chaque type d’utilisateur.

La logique du contrôleur de connexion utilise getOptionsForRole pour sélectionner différents rôles pour différents utilisateurs. Lorsque vous obtenez le jeton de délégation, vous pouvez indiquer à Auth0 quel rôle utiliser (c’est-à-dire, l’utilisateur est un administrateur ou non).

Dans le fichier pets/login/login.js, modifier les valeurs de role et de principal pour l’utilisateur non-administrateur afin d’attribuer le rôle IAM de l’utilisateur social que vous venez de créer.

À ce stade, vous devriez être en mesure de vous connecter en utilisant les identifiants Amazon ou ceux de l’utilisateur de base de données que vous avez créés précédemment. Veuillez noter que l’interface utilisateur autorise un utilisateur social à acheter des animaux de compagnie, tandis qu’un utilisateur administrateur peut en ajouter ou en supprimer.

Pour tester cette fonctionnalité, vous pouvez masquer temporairement la touche Supprimer dans l’interface utilisateur en supprimant ng-show="isAdmin" dans /pets/home/home.html :

<button ng-show="isAdmin" class="btn delete-btn" ng-click="removePet(pet.id)">remove</button>

Was this helpful?

/

Après avoir transféré les modifications dans votre bucket S3, tentez de supprimer un animal de compagnie tout en étant connecté en tant qu’utilisateur social.

Mettez à jour la logique du contrôleur principal pour permettre aux utilisateurs sociaux d’acheter des animaux de compagnie.

Dans home.js, modifiez la fonction buyPet pour activer les achats d’animaux de compagnie :

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);
    });
}
…

Was this helpful?

/

Copiez le code dans votre bucket S3, déconnectez-vous, puis reconnectez-vous en tant qu’utilisateur social en cliquant sur l’icône Amazon dans la boîte de dialogue Lock login. Vous devrez peut-être avoir besoin de cliquer sur AFFICHER TOUT, si votre connexion précédente persiste dans le volet Lock.

Veuillez noter qu’en tant qu’utilisateur Amazon, vous êtes autorisé à acheter un animal de compagnie, mais vous ne pouvez ni en ajouter ni en supprimer. En revanche, si vous vous connectez en tant qu’utilisateur via une connexion à la base de données, vous pouvez ajouter et supprimer des animaux de compagnie, mais vous ne pouvez pas en acheter.

Appliquer l’attribution des rôles avec les règles d'Auth0

Dans certains cas, vous pouvez définir le rôle approprié à l’aide de l’application (comme illustré ici). Cependant, pour des raisons de sécurité, par exemple, afin d’éviter qu’un utilisateur n’assume un rôle plus privilégié que nécessaire, il peut être préférable de déterminer les privilèges de l’utilisateur côté serveur.

Avec Auth0, cela est possible grâce aux règles, qui sont des instructions logiques que vous configurez et qui s’exécutent durant le processus d’authentification Auth0. Par exemple, vous pouvez créer des règles pour :

  • éliminer la transmission des informations de rôle du navigateur à l’application;

  • insérez les informations de rôle dans la demande de délégation en fonction de la source d’authentification.

Appliquer l’affectation de rôles

Vous ajouterez une règle qui vérifiera si le rôle demandé par l’utilisateur est autorisé, en fonction de son association avec une connexion sociale ou de base de données.

  1. Accédez à Auth0 Dashboard > Règles du pipeline et sélectionnez Créer une règle.

  2. Choisissez le modèle Règle vide

  3. Nommez la règle AWS Pets (ou quelque chose de similaire), puis remplissez le corps de la règle avec ce qui suit JavaScript code :

    function (user, context, callback) {
      if(context.clientID === '{yourClientId}') {
        var socialRoleInfo = {
          role:"arn:aws:iam::<your account>:role/auth0-api-social-role",
          principal: "arn:aws:iam::your account>:saml-provider/auth0"
        };
    
        var adminRoleInfo = {
          role:"arn:aws:iam::<your account>:role/auth0-api-role",
          principal: "arn:aws:iam::<your account>:saml-provider/auth0"
        };
    
        var requestRole = context.request.body.role;
        var requestPrincipal = context.request.body.principal;
        var allowedRole = null;
    
        if(user.identities[0].isSocial === false) {
          allowedRole = adminRoleInfo;
        } else {
          allowedRole = socialRoleInfo;
        }
    
        if((requestRole && requestRole !== allowedRole.role) ||
           (requestPrincipal && requestPrincipal !== allowedRole.principal)) {
            console.log('mismatch in requested role:',requestRole, ':', requestPrincipal);
            console.log('overridding');
        } else {
          console.log('valid or no role requested for delegation');
        }
    
        context.addonConfiguration = context.addonConfiguration || {};
        context.addonConfiguration.aws = context.addonConfiguration.aws || {};
        context.addonConfiguration.aws.role = allowedRole.role;
        context.addonConfiguration.aws.principal = allowedRole.principal;
        callback(null, user, context);
    
      } else {
        callback(null, user, context);
      }
    }

    Was this helpful?

    /
    Assurez-vous d’ajuster le code ci-dessus avec les valeurs correctes pour votre intégration. Les champs sont Princial ARN, Rôle ARN, et Client Secret.

  4. Enregistrer les modifications.

Mises en garde

  • Les règles s’exécutent à une permission globale pour chaque authentification. Vous ne devez exécuter la logique que sur les demandes d’authentification associées à une application donnée (c’est pourquoi le script utilisé demande le clientID). En l’absence de ces informations, la logique s’exécute à chaque demande d’authentification associée à votre compte Auth0.

  • Les informations sont transmises à la règle, accompagnées du contexte et de l’utilisateur.

  • Vous pouvez étendre les objets transmis à la règle. Dans le code ci-dessus, la règle examine le corps de la demande pour extraire les informations relatives aux rôles. Le rôle est défini dans le contexte addonConfiguration du rôle autorisé, qui remplace toujours les paramètres dans le corps de la demande.

Déboguer votre règle

Vous êtes prêt à déboguer votre/vos règle(s). Sélectionnez Essayez cette règle, et un script vous sera présenté pour tester la logique de la règle Sélectionner Essayer.

Vous verrez alors le résultat de l’exécution de votre règle.