Comment accéder aux en-têtes HTTP pour demander à AWS API Gateway à l’aide de Lambda?

Je vois dans la FAQ API Gateway qu’il est possible d’accéder aux en-têtes de requête envoyés à la passerelle API …

Si vous utilisez déjà des jetons OAuth ou tout autre mécanisme d’autorisation, vous pouvez facilement configurer API Gateway pour ne pas exiger d’appels d’API signés et renvoyer simplement les en-têtes de jeton à votre backend pour vérification.

Cependant, je ne trouve aucun exemple de la façon de procéder dans la documentation et il est difficile de savoir comment accéder à ces données avec Lambda.

Je peux configurer une API ouverte et accéder à l’object JSON qui fait partie d’un POST ( procédure pas à pas: API Gateway et fonctions Lambda ), mais pour implémenter une API de style OAuth 2.0 avec mon propre fournisseur, j’ai besoin d’accéder à l’en-tête “Authorization”.

Ma préférence est de configurer ceci en utilisant Lambda et Java 8, mais un exemple utilisant node.js serait également utile pour comprendre comment accomplir cela.

Vous devez créer un mappage d’entrée dans le panneau de Integration Request sur l’écran du tableau de bord décrivant votre méthode API.

Le code suivant convertit le paramètre d’entrée de la requête de name en Lambda Event input object :

 { "name": "$input.params('name')" } 

Capture d’écran:

Capture d'écran du tableau de bord API

Vous pouvez trouver plus d’informations à ce sujet dans le thread d’entrée API Gateway to Lambda d’origine sur les forums AWS .

Tout d’abord, vous devez intercepter l’en-tête Authorization de la requête HTTP GET. Ensuite, vous devez mapper cette valeur à l’object événement Lambda.

Accédez au tableau de bord de la méthode API et cliquez sur Requête de méthode. Vous pouvez y append un HTTP Request Header appelé Authorization comme indiqué ci-dessous.

En-têtes de requête HTTP

Cela va piéger l’en-tête d’ Authorization afin que vous puissiez l’utiliser plus tard.

Revenez maintenant au tableau de bord de la méthode et cliquez sur Integration Request . De là, vous pouvez transmettre la valeur de l’en-tête à la fonction Lambda en utilisant un mappage comme celui-ci.

 { "Authorization": "$input.params('Authorization')" } 

Maintenant, dans votre fonction Lambda, vous pouvez obtenir la valeur comme ceci.

 event.Authorization 

Vous pouvez utiliser le modèle de mappage suivant dans la demande d’intégration pour mapper de manière générique tous les parameters de chemin, d’interrogation et d’en-tête dans l’événement Lambda. Vous devrez toujours les enregistrer dans la section Method Request de la passerelle API, mais vous pouvez au moins découpler le template de mappage des parameters spécifiques que vous souhaitez utiliser. De cette façon, vous n’avez pas besoin de modifier le code du modèle de mappage chaque fois que vous modifiez les parameters d’en-tête, de requête ou de chemin.

J’ai écrit un article de blog qui donne plus de détails et quelques explications sur le modèle de cartographie: http://kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your-lambda-event -de-api-passerelle /

Voici le modèle de mappage que vous pouvez utiliser:

 { "method": "$context.httpMethod", "body" : $input.json('$'), "headers": { #foreach($param in $input.params().header.keySet()) "$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end #end }, "queryParams": { #foreach($param in $input.params().queryssortingng.keySet()) "$param": "$util.escapeJavaScript($input.params().queryssortingng.get($param))" #if($foreach.hasNext),#end #end }, "pathParams": { #foreach($param in $input.params().path.keySet()) "$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end #end } } 

Bien qu’il s’agisse d’un ancien thread, j’ai trouvé qu’il était préférable d’utiliser l’intégration de proxy lambda à cette fin. Avec cela, vous n’avez rien à configurer dans la passerelle API et vous obtenez tous les en-têtes de votre fonction lambda …

Selon la réponse de Prabhat, la configuration la plus simple consiste à utiliser la requête d’intégration de proxy lambda, après quoi vous pouvez accéder aux en-têtes de requête, aux parameters de chemin et aux parameters de requête via

 event['pathParameters']['param1'] event["querySsortingngParameters"]['queryparam1'] event['requestContext']['identity']['userAgent'] event['requestContext']['identity']['sourceIP']