it-swarm.dev

Bagaimana cara mengakses header HTTP untuk permintaan ke AWS API Gateway menggunakan Lambda?

Saya melihat di API Gateway FAQ bahwa adalah mungkin untuk mengakses header permintaan yang dikirim ke API Gateway ...

Jika Anda sudah menggunakan token OAuth atau otorisasi lain mekanisme, Anda dapat dengan mudah mengatur API Gateway untuk tidak memerlukan API yang ditandatangani panggilan dan cukup meneruskan token header ke backend Anda untuk verifikasi.

Namun, saya tidak dapat menemukan contoh bagaimana melakukannya di dokumentasi dan tidak jelas cara mengakses data ini menggunakan Lambda.

Saya dapat mengatur API terbuka dan mendapatkan akses ke objek JSON yang merupakan bagian dari POST ( Panduan: Fungsi Gateway Gateway dan Lambda ), tetapi untuk mengimplementasikan API gaya OAuth 2.0 dengan penyedia saya sendiri, saya perlu akses ke tajuk "Otorisasi".

Preferensi saya adalah untuk mengatur ini menggunakan Lambda dan Java 8, tetapi sebuah contoh menggunakan node.js juga akan membantu dalam memahami cara melakukannya.

40
JaredHatfield

Anda perlu membuat pemetaan input di dalam panel Integration Request pada layar dasbor yang menjelaskan metode API Anda.

Kode berikut menerjemahkan name parameter input permintaan ke Lambda Event input object:

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

Tangkapan layar:

API Dashboard screenshot

Anda dapat menemukan info lebih lanjut tentang ini di API Gateway asli ke utas masukan Lambda di Forum AWS .

21
kixorz

Pertama, Anda perlu menjebak header Authorization dari permintaan HTTP GET. Maka Anda perlu memetakan nilai itu ke objek acara Lambda.

Buka dasbor metode API dan klik pada Permintaan Metode. Di sana Anda dapat menambahkan HTTP Request Header yang disebut Authorization seperti yang ditunjukkan di bawah ini.

HTTP Request Headers

Ini akan menjebak header Authorization sehingga Anda dapat menggunakannya nanti.

Sekarang kembali ke dasbor metode dan klik Integration Request. Dari sini Anda dapat meneruskan nilai header ke fungsi Lambda dengan menggunakan pemetaan seperti ini.

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

Sekarang dalam fungsi Lambda Anda, Anda bisa mendapatkan nilai seperti ini.

event.Authorization
28
David Fevre

Anda dapat menggunakan Template Pemetaan berikut dalam Permintaan Integrasi untuk memetakan secara umum semua parameter jalur, kueri, dan header ke dalam acara Lambda. Anda masih perlu mendaftarkannya di bagian Metode Permintaan pada API Gateway tetapi Anda setidaknya dapat memisahkan Template Pemetaan dari parameter spesifik yang ingin Anda gunakan. Dengan cara ini Anda tidak perlu mengubah kode Templat Pemetaan setiap kali Anda mengubah tajuk, kueri, atau parameter lintasan.

Saya menulis posting blog yang memberikan lebih banyak detail dan beberapa penjelasan dari Template Pemetaan: http://kennbrodhagen.net/2015/12/12/bagaimana- untuk- membuat--request-object-object-for-your-lambda -Event-from-api-gateway/

Di sini adalah Templat Pemetaan yang dapat Anda gunakan:

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

sementara ini adalah utas lama, saya telah menemukan yang terbaik untuk menggunakan integrasi proxy lambda untuk tujuan tersebut. Dengan ini, Anda tidak perlu mengkonfigurasi apa pun di gateway API dan Anda mendapatkan semua header di fungsi lambda Anda ...

10
Prabhat

Sesuai jawaban Prabhat yang diatur dengan permintaan integrasi proxy lambda adalah cara paling sederhana untuk melakukan ini, setelah itu Anda dapat mengakses header permintaan, parameter jalur, dan parameter kueri melalui 

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

Solusi oleh kennbrodhagen bekerja sangat baik untuk saya, lihat jawabannya dan blog untuk detailnya. Karena poster itu menyatakan preferensi untuk implementasi Java, dan butuh beberapa saat untuk mencari tahu bagaimana menerapkan handler Kenn di Jawa, saya hanya berbagi kode Java yang sesuai:

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