Passer au contenu principal
Cette fonctionnalité utilise la délégation. Par défaut, la délégation est désactivée pour les locataires qui n’utilisaient aucun module complémentaire en date du 8 juin 2017. Les anciens locataires qui utilisent actuellement un module complémentaire nécessitant la délégation peuvent continuer à utiliser cette fonctionnalité. Si la fonctionnalité de délégation est modifiée ou retirée du service à un moment donné, les clients qui l’utilisent actuellement en seront avisés au préalable et disposeront de suffisamment de temps pour migrer. De plus, notez que la délégation ne prend pas en charge l’utilisation de domaines personnalisés; toute fonctionnalité qui en dépend pourrait donc ne pas être entièrement fonctionnelle avec un domaine personnalisé.

Étape 5 - Utiliser des jetons d’identité pour transmettre l’identité

Dans cette dernière étape, vous allez :
  • Transmettre l’identité au service en lui transmettant votre (JWT);
  • Valider le jeton;
  • Extraire les informations du profil pour attribuer un acheteur à un animal de compagnie.

Utiliser un jeton d’identité

Vous pouvez utiliser votre fonction Lambda pour traiter et obtenir des renseignements sur l’utilisateur. Par exemple, lors d’une transaction d’achat, vous avez récupéré le nom d’utilisateur à partir du profil renvoyé avec le . Toutefois, vous pouvez aussi choisir d’intégrer les renseignements de l’utilisateur directement à l’identité elle-même, sous la forme d’un JSON Web Token (JWT). Les avantages de l’utilisation des JWT sont les suivants :
  1. Vérifier l’authenticité du JWT ;
  2. Vous assurer que l’utilisateur appelant est authentifié (au lieu de vous fier à un paramètre en texte brut qui pourrait avoir été falsifié).
De plus, vous pouvez utiliser le JWT pour l’autorisation, ce qui vous permet de contourner l’intégration IAM avec Amazon API Gateway. Veuillez noter, toutefois, que l’utilisation d’API Gateway pour l’autorisation vous permet d’interrompre l’appel d’API avant l’invocation de votre fonction Lambda.

Ajouter des informations au JWT

Il existe plusieurs façons d’ajouter des informations sur un utilisateur au JWT. L’exemple suivant ajoute l’adresse courriel de l’utilisateur au JWT, mais le même principe s’applique à d’autres données utilisateur.

Utiliser les Rules

Une façon d’ajouter l’adresse de courriel d’un utilisateur au JWT consiste à utiliser une Rule. C’est une bonne approche si vous voulez vous assurer que cette valeur est toujours disponible dans le JWT pour un utilisateur qui s’authentifie. Dans login.js, vous pouvez voir ce scope indiqué dans les paramètres transmis à auth.signin :
$scope.login = function() {
    var params = {
        authParams: {
          scope: 'openid email'
        }
      };

    auth.signin(params, function(profile, token) {
      ...
    }
  }
Bien que vous puissiez inclure le profil complet de l’utilisateur dans le JWT, il est préférable de n’y inclure que les éléments nécessaires, puisque le JWT est généralement transmis avec chaque requête.

Valider le jeton JWT

Comme la console AWS Lambda ne donne accès qu’à un nombre limité de modules Node lorsque vous saisissez votre code Node.js dans la console du navigateur, vous devrez inclure des modules supplémentaires et téléverser la fonction Lambda sous forme de package afin de traiter le jeton d’identité. Pour plus de détails, consultez Création de packages de déploiement avec Node.js et Téléversement et test de packages de déploiement. Le projet de base suivant contient le code dont vous aurez besoin pour votre fonction AWS Lambda mise à jour.
<%= include('../../../_includes/_package', { org: 'auth0', repo: 'auth0-aws', path: 'examples/api-gateway/lambda' }) %>
Vous verrez deux fichiers JavaScript personnalisés dans le projet de départ :
  • index.js : contient votre code principal;
  • auth0-variables : contient le code que vous devez mettre à jour.
En plus des fichiers personnalisés, il y a un fichier Node.js package.json standard. Le code ajoute la fonctionnalité nécessaire pour extraire des informations du JWT et le valider. Par défaut, Auth0 utilise une clé symétrique pour signer le JWT, mais vous pouvez choisir d’utiliser des clés asymétriques (si vous devez permettre à des tiers de valider votre jeton, vous devriez utiliser une clé asymétrique et ne partager que votre clé publique). Pour en savoir plus sur la vérification des jetons, consultez Identity Protocols Supported by Auth0. Mettez à jour auth0-variables.js avec votre clé secrète, que vous trouverez dans l’onglet Settings de votre application dans le  :
var env={};
env.AUTH0_SECRET='{yourAuth0Secret}';
module.exports = env;
Exécutez npm install dans le répertoire où se trouvent vos fichiers, compressez ensuite le contenu dans un fichier zip (index.js doit se trouver à la racine du fichier zip), puis téléversez-le pour qu’il soit utilisé par la fonction Lambda PurchasePet. Si vous effectuez ce test, vous devriez voir une erreur d’autorisation, puisque le JWT ne se trouve pas dans le corps du message. Examinez la logique dans index.js. Vous verrez, vers la ligne 60, du code qui valide le jeton et extrait les informations décodées qui contiennent les renseignements d’identité utilisés par la logique d’achat :
if(event.authToken) {
     jwt.verify(event.authToken, secret, function(err, decoded) {
         if(err) {
           console.log('failed jwt verify: ', err, 'auth: ', event.authToken);
           context.done('authorization failure', null);
         } else if(!decoded.email)
         {
           console.log('err, email missing in jwt', 'jwt: ', decoded);
           context.done('authorization failure', null);
         } else {
           userEmail = decoded.email;
           console.log('authorized, petId', petId, 'userEmail:', userEmail);
           dynamo.getItem({TableName:"Pets", Key:{username:"default"}}, readcb);
         }
     });
  } else {
     console.log('invalid authorization token', event.authToken);
     context.done('authorization failure', null);
  }
    ...

Extraire les informations du profil pour assigner un acheteur

La dernière étape consiste à transmettre le JWT à la méthode utilisée par le client du navigateur. La méthode standard inclut un en-tête Authorization comme jeton Bearer, et vous pouvez utiliser cette méthode en désactivant l’autorisation IAM et en vous fiant uniquement au jeton OpenID pour l’autorisation (vous devrez également faire correspondre l’en-tête Authorization aux données d’événement transmises à la fonction AWS Lambda). Si, toutefois, vous utilisez IAM, AWS API Gateway se sert de l’en-tête Authorization pour transmettre la signature du message, et vous compromettrez l’authentification en insérant le JWT dans cet en-tête. Pour ce faire, vous pouvez soit :
  • Ajouter un en-tête personnalisé pour le JWT ;
  • Placer l’en-tête personnalisé dans le corps du message.
Si vous choisissez d’utiliser un en-tête personnalisé, vous devrez aussi effectuer un mappage pour la requête d’intégration de la méthode POST pour pets/purchase. Pour simplifier le processus de validation, transmettez le JWT dans le corps de la requête POST à la fonction AWS Lambda. Pour ce faire, mettez à jour la méthode buyPet dans home.js en supprimant userName du corps, puis en ajoutant authToken comme suit :
function buyPet(user, id) {
    var apigClient = getSecureApiClient();
    var body = {
      petId:id,
      authToken: store.get('token')
    };

    apigClient.petsPurchasePost({}, body)
      .then(function(response) {
        console.log(response);
        $scope.pets = response.data;
        $scope.$apply();
      }).catch(function (response) {
        alert('buy pets failed');
        showError(response);
    });
}
Téléversez votre code dans votre bucket S3, puis essayez d’acheter un animal de compagnie. Vous verrez le courriel de l’acheteur dans le message affiché. Si des erreurs se produisent, assurez-vous d’avoir correctement configuré votre clé secrète. Un outil utile pour vérifier les problèmes de décodage de votre jeton est jwt.io.

Résumé

Dans ce tutoriel, vous avez :
  • Créé une API à l’aide d’AWS API Gateway qui comprend des méthodes utilisant des fonctions AWS Lambda ;
  • Sécurisé l’accès à votre API à l’aide de rôles IAM ;
  • Intégré un à IAM afin de lier l’accès à l’API à votre base d’utilisateurs ;
  • Offert différents niveaux d’accès selon qu’un utilisateur s’est authentifié au moyen de la connexion de base de données ou d’une connexion sociale ;
  • Utilisé une Rule d’Auth0 pour appliquer l’attribution des rôles ;
  • Utilisé un JWT pour fournir un contexte d’autorisation supplémentaire et transmettre les renseignements d’identité à la fonction Lambda appropriée.