it-swarm.com.de

Wie kann auf HTTP-Header für eine Anfrage an AWS API Gateway mit Lambda zugegriffen werden?

Ich sehe im API Gateway FAQ , dass auf die Anforderungsheader zugegriffen werden kann, die an das API-Gateway gesendet werden ...

Wenn Sie bereits OAuth-Token oder eine andere Berechtigung verwenden können Sie das API-Gateway problemlos so einrichten, dass keine signierte API .__ erforderlich ist. ruft die Tokenheader für .__ an Ihr Backend auf. Nachprüfung.

Ich kann jedoch in der Dokumentation kein Beispiel dafür finden, und es ist unklar, wie auf diese Daten mit Lambda zugegriffen werden kann.

Ich kann eine offene API einrichten und Zugriff auf das JSON-Objekt erhalten, das Teil eines POST ( Walkthrough: API-Gateway und Lambda-Funktionen ) ist, aber um eine OAuth 2.0-API zu implementieren Bei meinem eigenen Provider benötige ich Zugriff auf den Header "Authorization".

Ich bevorzuge es, dies mit Lambda und Java 8 einzurichten, aber ein Beispiel mit node.js wäre auch hilfreich, um zu verstehen, wie Sie dies erreichen können.

40
JaredHatfield

Sie müssen eine Eingabezuordnung im Integration Request-Bedienfeld im Dashboard-Bildschirm erstellen, in der Ihre API-Methode beschrieben wird.

Der folgende Code übersetzt den Abfrageparameter name in Lambda Event input object:

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

Bildschirmfoto:

API Dashboard screenshot

Weitere Informationen hierzu finden Sie im ursprünglichen API-Gateway-zu-Lambda-Eingabethread in den AWS-Foren .

21
kixorz

Zuerst müssen Sie den Authorization-Header von der HTTP-GET-Anforderung abfangen. Dann müssen Sie diesen Wert dem Lambda-Ereignisobjekt zuordnen.

Gehen Sie zum API-Methoden-Dashboard und klicken Sie auf Method Request. Dort können Sie einen HTTP Request Header namens Authorization hinzufügen, wie unten gezeigt.

HTTP Request Headers

Dadurch wird der Authorization-Header abgefangen, sodass Sie ihn später verwenden können.

Gehen Sie nun zurück zum Methoden-Dashboard und klicken Sie auf Integration Request. Von hier aus können Sie den Wert des Headers in die Lambda-Funktion übergeben, indem Sie ein solches Mapping verwenden.

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

Jetzt können Sie in Ihrer Lambda-Funktion den Wert so erhalten.

event.Authorization
28
David Fevre

Sie können die folgende Zuordnungsvorlage in der Integrationsanforderung verwenden, um alle Parameter für Pfad, Abfrage und Header generell dem Lambda-Ereignis zuzuordnen. Sie müssen sie dennoch im Abschnitt Method Request des API-Gateways registrieren. Sie können die Zuordnungsvorlage jedoch zumindest von den bestimmten Parametern abkoppeln, die Sie verwenden möchten. Auf diese Weise müssen Sie den Code für die Zuordnungsvorlage nicht jedes Mal ändern, wenn Sie Header-, Abfrage- oder Pfadparameter ändern.

Ich habe einen Blogbeitrag geschrieben, der weitere Einzelheiten und eine Erläuterung der Mapping-Vorlage enthält: http://kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your-lambda -event-from-api-gateway/

Hier ist die Zuordnungsvorlage, die Sie verwenden können:

{
  "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
  }  
}
26
kennbrodhagen

obwohl dies ein alter Thread ist, habe ich es am besten gefunden, für diesen Zweck die Lambda-Proxy-Integration zu verwenden. Damit müssen Sie nichts im API-Gateway konfigurieren und erhalten alle Header Ihrer Lambda-Funktion ...

10
Prabhat

Gemäß Prabhats Antwort ist das Einrichten der Lambda-Proxy-Integrationsanforderung die einfachste Möglichkeit, dies auszuführen. Danach können Sie auf die Anforderungsheader, Pfadparameter und Abfrageparameter über zugreifen 

event['pathParameters']['param1']
event["queryStringParameters"]['queryparam1']
event['requestContext']['identity']['userAgent']
event['requestContext']['identity']['sourceIP']
1
Jonathan

Die Lösung von kennbrodhagen hat für mich sehr gut funktioniert, siehe seine Antwort und seinen Blog für die Details. Da das Poster eine Vorliebe für die Java-Implementierung zum Ausdruck brachte und ich eine Weile brauchte, um herauszufinden, wie Kenns Handler in Java implementiert werden kann, teile ich nur den entsprechenden Java-Code:

public class MyHandler implements RequestHandler<Map<String,Object>,String> {

    @Override
    public String handleRequest(Map<String,Object> eventMap, Context context) {
        LambdaLogger logger = context.getLogger();
        logger.log("Body:" + eventMap.get("body"));
        logger.log("Headers:" + eventMap.get("headers"));
        logger.log("Method:" + eventMap.get("method"));
        logger.log("Params:" + eventMap.get("params"));
        logger.log("Query:" + eventMap.get("query"));
        return("{}");
    }
}
0
mojoken