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

> Étape 5 du tutoriel Amazon API Gateway

# Étape 5 du tutoriel AWS API Gateway

<Warning>
  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é.
</Warning>

<div id="step-5-use-identity-tokens-to-flow-identity">
  ## Étape 5 - Utiliser des jetons d'identité pour transmettre l'identité
</div>

Dans cette dernière étape, vous allez :

* Transmettre l'identité au service en lui transmettant votre <Tooltip tip="OpenID : norme ouverte d'authentification qui permet aux applications de vérifier l'identité des utilisateurs sans recueillir ni stocker les renseignements de connexion." cta="Voir le glossaire" href="/fr-CA/docs/glossary?term=OpenID">OpenID</Tooltip> <Tooltip tip="OpenID : norme ouverte d'authentification qui permet aux applications de vérifier l'identité des utilisateurs sans recueillir ni stocker les renseignements de connexion." cta="Voir le glossaire" href="/fr-CA/docs/glossary?term=JSON+Web+Token">JSON Web Token</Tooltip> (JWT);
* Valider le jeton;
* Extraire les informations du profil pour attribuer un acheteur à un animal de compagnie.

<div id="use-an-identity-token">
  ## Utiliser un jeton d’identité
</div>

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 <Tooltip tip="ID Token : jeton destiné à l’application cliente elle-même, plutôt qu’à l’accès à une ressource." cta="Voir le glossaire" href="/fr-CA/docs/glossary?term=identity+token">jeton d’identité</Tooltip>. 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.

<div id="add-information-to-the-jwt">
  ### Ajouter des informations au JWT
</div>

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.

<div id="use-rules">
  #### Utiliser les Rules
</div>

Une façon d’ajouter l’adresse de courriel d’un utilisateur au JWT consiste à utiliser une [Rule](/fr-CA/docs/customize/rules). 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` :

```js 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, 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.

<div id="validate-the-jwt-token">
  ## Valider le jeton JWT
</div>

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](http://docs.aws.amazon.com/lambda/latest/dg/nodejs-create-deployment-pkg.html) et [Téléversement et test de packages de déploiement](http://docs.aws.amazon.com/lambda/latest/dg/walkthrough-s3-events-adminuser-create-test-function-upload-zip-test.html).

Le projet de base suivant contient le code dont vous aurez besoin pour votre fonction AWS Lambda mise à jour.

```js wrap lines theme={null}
<%= 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](/fr-CA/docs/authenticate/protocols).

Mettez à jour `auth0-variables.js` avec votre clé secrète, que vous trouverez dans l’onglet Settings de votre application dans le <Tooltip tip="Auth0 Dashboard : console principale d’Auth0 pour configurer vos services." cta="Voir le glossaire" href="/fr-CA/docs/glossary?term=Auth0+Dashboard">Auth0 Dashboard</Tooltip> :

```javascript lines theme={null}
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 :

```js 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);
  }
    ...
```

<div id="extract-profile-information-to-assign-a-buyer">
  ### Extraire les informations du profil pour assigner un acheteur
</div>

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 :

```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, 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](http://jwt.io/).

<div id="summary">
  ## Résumé
</div>

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 <Tooltip tip="Fournisseur d’identité (IdP) : service qui stocke et gère les identités numériques." cta="Voir le glossaire" href="/fr-CA/docs/glossary?term=SAML">SAML</Tooltip> <Tooltip 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" href="/fr-CA/docs/glossary?term=identity+provider">fournisseur d’identité</Tooltip> à 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.
