2015-07-12 12 views
33

vedo nel API Gateway FAQ che è possibile accedere le intestazioni di richiesta informazioni alla gateway API ...Come accedere alle intestazioni HTTP per la richiesta al gateway API AWS utilizzando Lambda?

Se già utilizzano token OAuth o qualsiasi altro meccanismo di autorizzazione , si può facilmente impostare gateway API non richiedere le chiamate firmate API e inoltrare semplicemente le intestazioni dei token al back-end per la verifica .

Tuttavia, non riesco a trovare alcun esempio di come farlo nella documentazione e non è chiaro come accedere a questi dati utilizzando Lambda.

Sono in grado di configurare un'API aperta e accedere all'oggetto JSON che fa parte di un POST (Walkthrough: API Gateway and Lambda Functions), ma per implementare un'API in stile OAuth 2.0 con il mio provider è necessario accedere a " Autorizzazione "intestazione.

La mia preferenza è impostare questo utilizzando Lambda e Java 8, ma un esempio utilizzando node.js sarebbe anche utile per capire come ottenere ciò.

risposta

19

È necessario creare il mapping di input all'interno del pannello Integration Request nella schermata del dashboard che descrive il metodo dell'API.

Seguendo codice traduce parametro di ingresso name query in Lambda Event input object:

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

Screenshot:

API Dashboard screenshot

Potete trovare maggiori informazioni su questo in originale API Gateway to Lambda input thread on AWS Forums.

+1

Inoltre, una volta terminato, non dimenticare di salvare le modifiche e ridistribuire l'API. – kixorz

27

Innanzitutto, è necessario intercettare l'intestazione Authorization dalla richiesta HTTP GET. Quindi è necessario associare quel valore all'oggetto evento Lambda.

Passare al dashboard del metodo API e fare clic su Richiedi metodo. Qui puoi aggiungere uno HTTP Request Header chiamato Authorization come mostrato di seguito.

HTTP Request Headers

Questa trappola volontà l'intestazione Authorization in modo da poter utilizzare in un secondo momento.

Ora tornare al dashboard dei metodi e fare clic su Integration Request. Da qui puoi passare il valore dell'intestazione nella funzione Lambda utilizzando una mappatura come questa.

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

Ora nella funzione Lambda è possibile ottenere il valore in questo modo.

event.Authorization 
25

È possibile utilizzare il seguente modello Mapping nella integrazione richiesta genericamente mappare tutti i parametri di percorso, di query, e di intestazione nell'evento Lambda. Sarà comunque necessario registrarli nella sezione Richiesta metodo del gateway API, ma è possibile almeno disaccoppiare il modello di mappatura dai parametri specifici che si desidera utilizzare. In questo modo non è necessario modificare il codice del modello di mappatura ogni volta che si modificano i parametri di intestazione, query o percorso.

ho scritto un post sul blog che fornisce maggiori dettagli e una spiegazione del modello di mappatura: http://kennbrodhagen.net/2015/12/06/how-to-create-a-request-object-for-your-lambda-event-from-api-gateway/

Qui è il modello di mappatura è possibile utilizzare:

{ 
    "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

Questo è un peccato posso solo andare avanti una volta :), ho passato così tanto tempo su di esso, quando stavo usando '$ input.json ('$')' per ottenere tutto il corpo non potevo più usare '$ input.params () 'per ottenere le intestazioni, è strano che funzioni con VTL. comunque grazie mille! – Tiago

4

mentre questo è un vecchio filo, ho ho trovato il modo migliore per utilizzare l'integrazione proxy lambda per lo scopo. Con questo non devi configurare nulla nel gateway API e ottieni tutte le intestazioni nella tua funzione lambda ...

+0

Posso confermare che questo è ora l'approccio migliore per eseguire l'inoltro di intestazione per richieste ed è anche quello che ho utilizzato in diversi progetti da quando ho fatto questa domanda. Tuttavia, poiché la mia domanda iniziale era orientata verso la configurazione di forwarding dell'header, non ho intenzione di modificare la risposta accettata. – JaredHatfield

0

Come per la risposta di Prabhat impostare con la richiesta di integrazione del proxy lambda è il modo più semplice per farlo, dopo di che è possibile accedere alle intestazioni delle richieste, ai parametri del percorso e ai parametri di query tramite

event['pathParameters']['param1'] 
event["queryStringParameters"]['queryparam1'] 
event['requestContext']['identity']['userAgent'] 
event['requestContext']['identity']['sourceIP'] 
Problemi correlati