2015-07-12 4 views
33

ich in der API Gateway FAQ sehen, dass es möglich ist, die Request-Header an das API-Gateway gesendet zugreifen ...Zugriff auf HTTP-Header für die Anfrage an AWS API Gateway mit Lambda?

Wenn Sie bereits OAuth-Token verwenden oder eine andere Berechtigung Mechanismus, können Sie einfach Setup-API-Gateway nicht Erfordert signierte API-Aufrufe und einfach die Token-Header an Ihr Back-End für Verifizierung weiterleiten.

Ich finde jedoch kein Beispiel dafür in der Dokumentation und es ist unklar, wie man mit Lambda auf diese Daten zugreifen kann.

Ich kann eine offene API einrichten und Zugriff auf das JSON-Objekt, das Teil eines POST ist (Walkthrough: API Gateway and Lambda Functions), aber um eine OAuth 2.0-API mit meinem eigenen Provider zu implementieren, brauche ich Zugriff auf die " Autorisierung "Kopfzeile.

Meine Präferenz ist es, dies mit Lambda und Java 8 einzurichten, aber ein Beispiel mit node.js wäre auch hilfreich, um zu verstehen, wie dies zu erreichen ist.

Antwort

19

Sie müssen die Eingabezuordnung innerhalb des Bereichs Integration Request auf dem Dashboard-Bildschirm erstellen, der Ihre API-Methode beschreibt.

folgenden Code übersetzt name Abfrage-Parameter in Lambda Event input object:

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

Screenshot:

API Dashboard screenshot

Sie weitere Informationen über diese in der ursprünglichen API Gateway to Lambda input thread on AWS Forums finden.

+1

auf die Anforderungsheader, Pfadparameter und Abfrageparameter zugreifen. Vergessen Sie außerdem nicht, Ihre Änderungen zu speichern und Ihre API erneut bereitzustellen. – kixorz

27

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

Gehen Sie zum Dashboard der API-Methode und klicken Sie auf Methodenanforderung. Dort können Sie wie folgt eine HTTP Request Header namens Authorization hinzufügen.

HTTP Request Headers

Dies wird Falle der Authorization Header, so dass Sie es später verwenden können.

Gehen Sie jetzt 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 in Ihrer Lambda-Funktion können Sie den Wert so erhalten.

25

Sie können die folgende Zuordnungsvorlage in der Integrationsanforderung verwenden, um alle Pfad-, Abfrage- und Header-Parameter generisch dem Lambda-Ereignis zuzuordnen. Sie müssen sie weiterhin im Abschnitt Method Request des API-Gateways registrieren, aber Sie können die Mapping-Vorlage zumindest von den spezifischen Parametern entkoppeln, die Sie verwenden möchten. Auf diese Weise müssen Sie den Mapping-Vorlagencode nicht jedes Mal ändern, wenn Sie Header-, Abfrage- oder Pfadparameter ändern.

Ich schrieb einen Blog-Post, die mehr Details und eine Erklärung der Mapping-Vorlage gibt: http://kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your-lambda-event-from-api-gateway/

Hier ist die Mapping-Vorlage 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 
    } 
} 
+0

Das ist eine Schande, ich kann nur einmal upvote :), verbrachte so viel Zeit darauf, als ich '$ input.json ('$')' verwendet, um den ganzen Körper zu bekommen, konnte ich '$ input.params nicht mehr verwenden) 'um Header zu bekommen, das ist seltsam, es funktioniert mit VTL. trotzdem vielen Dank! – Tiago

4

während dies ist ein alter Thread, ich haben es am besten gefunden, Lambda-Proxy-Integration für den Zweck zu verwenden. Damit müssen Sie nichts im API-Gateway konfigurieren und Sie erhalten alle Header in Ihrer Lambda-Funktion ...

+0

Ich kann bestätigen, dass dies der beste Ansatz ist, um die Header-Weiterleitung für Anfragen zu erreichen, und es ist auch, was ich in mehreren Projekten verwendet habe, seit ich diese Frage gestellt habe. Da meine ursprüngliche Frage jedoch auf die Header-Weiterleitungskonfiguration ausgerichtet war, werde ich die angenommene Antwort nicht ändern. – JaredHatfield

0

Laut Prabhats Antwort ist die Einrichtung der Lambda-Proxy-Integrationsanforderung der einfachste Weg, dies zu tun, Danach können Sie über

event['pathParameters']['param1'] 
event["queryStringParameters"]['queryparam1'] 
event['requestContext']['identity']['userAgent'] 
event['requestContext']['identity']['sourceIP'] 
Verwandte Themen