Comment accéder aux en-têtes HTTP pour les requêtes vers la passerelle AWS API en utilisant Lambda?

je vois dans le API passerelle FAQ 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 tokens OAuth ou toute autre autorisation mécanisme, vous pouvez facilement configurer API Gateway pour ne pas avoir besoin D'API signée appelle et simplement avancer les en-têtes token à votre arrière-plan pour vérification.

cependant, je ne peux trouver aucun exemple de comment le faire dans la documentation et il n'est pas clair comment accédez à ces données en utilisant Lambda.

je suis capable de configurer une API ouverte et d'accéder à l'objet JSON qui fait partie d'un POST (Procédure pas à pas: de la Passerelle API et les Lambda Fonctions), mais pour implémenter une API de style 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 en utilisant node.js serait également utile pour comprendre comment y parvenir.

38
demandé sur JaredHatfield 2015-07-12 23:20:28

5 réponses

vous devez créer la cartographie des entrées à l'intérieur de Integration Request panneau sur l'écran de tableau de bord décrivant votre méthode API.

traduit le code suivant name requête de paramètre d'entrée dans Lambda Event input object:

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

Capture d'écran:

API Dashboard screenshot

Vous pouvez trouver plus d'informations à ce sujet dans l'original Passerelle API pour Lambda entrée thread sur le forum AWS.

20
répondu kixorz 2015-07-13 01:45:20

tout d'abord, vous devez piéger le Authorization en-tête de la requête HTTP GET. Ensuite, vous devez associer cette valeur à L'objet Lambda event.

allez dans le tableau de bord de la méthode API et cliquez sur demande de méthode. De là, vous pouvez ajouter un HTTP Request HeaderAuthorization comme indiqué ci-dessous.

HTTP Request Headers

piège Authorization en-tête pour pouvoir l'utiliser plus tard.

maintenant, retournez au tableau de bord de la méthode et cliquez sur Integration Request. De là, vous pouvez passer à la valeur de l'en-tête dans la fonction Lambda en utilisant un mapping comme celui-ci.

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

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

event.Authorization
28
répondu David Fevre 2015-07-13 16:37:07

Vous pouvez utiliser le modèle de mappage suivant dans la requête D'intégration pour mapper de manière générique tous les paramètres de chemin, de requête et d'en-tête dans L'événement Lambda. Vous aurez toujours besoin de les enregistrer dans la section Demande de méthode de la passerelle API, mais vous pouvez au moins découpler le modèle de Mapping des paramètres spécifiques que vous voulez utiliser. De cette façon, vous n'avez pas à modifier le code du modèle de mappage à chaque fois que vous changez les en-têtes, les paramètres de requête ou de chemin.

j'ai écrit un post de blog cela donne plus de détails et une explication du modèle de Mapping: http://kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your-lambda-event-from-api-gateway/

voici le modèle de Mapping 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().querystring.keySet())
    "$param": "$util.escapeJavaScript($input.params().querystring.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
  }  
}
25
répondu kennbrodhagen 2015-12-07 01:23:05

bien qu'il s'agisse d'un vieux fil, j'ai trouvé qu'il était préférable d'utiliser lambda proxy integration dans ce but. Avec cela, vous n'avez pas à configurer quoi que ce soit dans la passerelle API et vous obtenez tous les en-têtes de votre fonction lambda...

9
répondu Prabhat 2017-05-07 11:30:28

Comme par Prabhat la réponse de la configuration avec le lambda de proxy intégration de la demande est le moyen le plus simple pour ce faire, après quoi vous pouvez accéder aux en-têtes de requête, chemin des paramètres et les paramètres de requête à l'aide de

event['pathParameters']['param1']
event["queryStringParameters"]['queryparam1']
event['requestContext']['identity']['userAgent']
event['requestContext']['identity']['sourceIP']
1
répondu Jonathan 2017-09-08 10:43:23