> ## Documentation Index
> Fetch the complete documentation index at: https://auth0.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Tutoriel AWS API Gateway - Étape 5

> Étape 5 du tutoriel Amazon API Gateway

<Warning>
  Cette fonctionnalité utilise la délégation. Par défaut, la délégation est désactivée pour les locataires sans module complémentaire en cours d’utilisation depuis le 8 juin 2017. Les anciens locataires qui utilisent actuellement un module complémentaire nécessitant une délégation peuvent continuer à utiliser cette fonction. Si la fonctionnalité de délégation est modifiée ou supprimée à un moment donné, les clients qui l’utilisent seront informés à l’avance et disposeront d’un délai suffisant pour migrer. Par ailleurs, notez que la délégation ne prend pas en charge l’utilisation de domaines personnalisés, si bien que toutes les fonctionnalités qui en dépendent risquent de ne pas être pleinement fonctionnelles avec un domaine personnalisé.
</Warning>

## Étape 6 - Utilisation des jetons d’identité pour le flux Identité

Dans cette dernière étape, vous allez :

* Transmettre l’identité au service en passant votre jeton Web JSON <Tooltip href="/docs/fr-ca/glossary?term=openid" tip="OpenID
  Norme ouverte d’authentification qui permet aux applications de vérifier l’identité des utilisateurs sans avoir à collecter leurs informations de connexion." cta="Voir le glossaire">OpenID</Tooltip> (<Tooltip href="/docs/fr-ca/glossary?term=json-web-token" tip="Jeton Web JSON (JWT)
  Format standard de jeton d’ID (et souvent de jeton d’accès) utilisé pour représenter en toute sécurité des demandes entre deux parties." cta="Voir le glossaire">JWT</Tooltip>);
* Valider le jeton;
* Extraire les informations de profil pour attribuer un acheteur à un animal de compagnie.

## Utilisation d’un jeton d’ID

Vous pouvez utiliser votre fonction Lambda pour traiter et obtenir des informations 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 jeton d’ID. Cependant, vous pouvez également choisir d’intégrer les informations de l’utilisateur à l’identité elle-même, qui est un jeton Web JSON (JWT).

L’utilisation des JWT présente l’avantage de pouvoir :

1. Vérifier l’authenticité du JWT;
2. Être sûr que l’utilisateur appelant est authentifié (au lieu de se fier à un paramètre en texte clair qui pourrait avoir été falsifié).

En outre, vous pouvez utiliser le JWT pour l’autorisation, ce qui vous permet de contourner l’intégration IAM avec Amazon API Gateway. Notez toutefois que l’utilisation de l' API Gateway pour l’autorisation vous permet d’interrompre l’appel API avant l’invocation de votre fonction Lambda.

### Ajout d’informations au JWT

Il existe plusieurs façons d’ajouter les informations d’un utilisateur au JWT. L’exemple suivant ajoute l’adresse courriel de l’utilisateur au JWT, mais les concepts sont les mêmes pour les autres données de l’utilisateur.

#### Règles d’utilisation

Une façon d’ajouter l’adresse courriel d’un utilisateur au JWT est d’utiliser une [règle](/docs/fr-ca/rules). Il s’agit d’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 cette permission spécifiée dans les paramètres passés à `auth.signin` :

```javascript lines theme={null}
$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, vous ne devez inclure que ce qui est nécessaire puisque le JWT est généralement transmis avec chaque requête.

## Validation du jeton JWT

Étant donné que la console AWS Lambda a accès à un nombre limité de modules Node qui peuvent être utilisés lorsque vous entrez votre code Node.js à l’aide de la console du navigateur, vous devrez inclure des modules supplémentaires et téléverser la fonction Lambda en tant que package pour traiter le jeton d’ID.

Pour plus de détails, consultez [Création de paquets de déploiement à l’aide de Node.js](http://docs.aws.amazon.com/lambda/latest/dg/nodejs-create-deployment-pkg.html) et [Téléversement des paquets de déploiement et tests](http://docs.aws.amazon.com/lambda/latest/dg/walkthrough-s3-events-adminuser-create-test-function-upload-zip-test.html).

Le projet « seed » 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 seed :

* `index.js` : contient votre code principal;
* `auth0-variables` : contient le code que vous devez mettre à jour.

Outre les fichiers personnalisés, il existe un fichier Node.js standard `package.json`.

Le code ajoute une fonctionnalité permettant d’extraire des informations et de valider le JWT. Par défaut, Auth0 utilise une clé symétrique pour signer le JWT, bien que vous puissiez choisir d’utiliser des clés asymétriques (si vous avez besoin d’autoriser la validation de votre jeton par un tiers, vous devriez utiliser une clé asymétrique et ne partager que votre clé publique).

Pour plus d’informations sur la vérification des jetons, consultez [Protocoles d’identité pris en charge par Auth0](/docs/fr-ca/authenticate/protocols).

Mettez à jour `auth0-variables.js` avec votre clé secrète, qui peut être trouvée dans l’onglet Paramètres de votre application dans l’

<Tooltip href="/docs/fr-ca/glossary?term=auth0-dashboard" tip="Auth0 Dashboard
Principal produit d’Auth0 pour configurer vos services." cta="Voir le glossaire">Auth0 Dashboard</Tooltip> :

```javascript lines theme={null}
var env={};
env.AUTH0_SECRET='{yourAuth0Secret}';
module.exports = env;
```

Exécutez **npm install** depuis le répertoire où se trouvent vos fichiers, zippez le contenu (`index.js` doit être à la racine du zip), et téléversez-le pour qu’il soit utilisé par la fonction Lambda `PurchasePet`. Si vous testez, vous devriez voir un échec d’autorisation, puisque le JWT n’est pas dans le corps du message.

Regardez la logique dans `index.js`. Vous verrez la logique autour de la ligne 60 qui valide le jeton et extrait les informations décodées qui contiennent les informations d’identité utilisées pour la logique d’achat :

```javascript lines theme={null}
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 de profil pour affecter un acheteur

La dernière étape consiste à transmettre le JWT à la méthode utilisée par le navigateur client.

La méthode standard s’accompagne d’un en-tête `Autorisation` en tant que jeton du porteur, et vous pouvez utiliser cette méthode en désactivant l’autorisation IAM et en vous appuyant uniquement sur le jeton OpenID pour l’autorisation (vous devrez également mapper l’en-tête Autorisation dans les données d’événement transmises à la fonction AWS Lambda).

Toutefois, si vous utilisez IAM, la passerelle API AWS utilise l’en-tête `Autorisation` pour contenir la signature du message, et vous interromprez 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,
* soit placer l’en-tête personnalisé dans le corps du message.

Si vous choisissez d’utiliser un en-tête personnalisé, vous devrez également 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 du message à la fonction AWS Lambda. Pour ce faire, mettez à jour la méthode `buyPet` dans `home.js` en supprimant le `userName` du corps et en ajoutant `authToken` comme suit :

```javascript lines theme={null}
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 et essayez d’acheter un animal de compagnie. Vous verrez le courriel de l’acheteur dans le message résultant.

Si vous rencontrez des erreurs, vérifiez que vous avez correctement défini votre clé secrète. Un outil utile pour vérifier les problèmes de décodage des jetons est [jwt.io](http://jwt.io/).

## Résumé

Dans ce tutoriel, vous avez réalisé ce qui suit :

* Créé une API à l’aide d’AWS API Gateway qui inclut des méthodes utilisant des fonctions AWS Lamdba.
* Sécurisé l’accès à votre API à l’aide des rôles IAM.
* Intégré un fournisseur d’identités <Tooltip href="/docs/fr-ca/glossary?term=security-assertion-markup-language" tip="Security Assertion Markup Language (SAML)
  Protocole normalisé permettant à deux parties d’échanger des informations d’authentification sans mot de passe." cta="Voir le glossaire">SAML</Tooltip> avec IAM pour associer l’accès à l’API à votre base d’utilisateurs.
* Fourni différents niveaux d’accès selon que l’utilisateur s’authentifie à partir de la base de données ou de la connexion sociale.
* Utilisé une règle Auth0 pour renforcer l’attribution des rôles.
* Utilisé un JWT pour fournir un contexte d’autorisation supplémentaire et transmettre les informations d’identité à la fonction Lambda appropriée.
