Meskipun CORS telah disiapkan melalui API Gateway dan Access-Control-Allow-Origin
header telah disetel, saya masih menerima kesalahan berikut saat mencoba memanggil API dari AJAX dalam Chrome:
XMLHttpRequest tidak dapat memuat http://XXXXX.execute-api.us-west-2.amazonaws.com/beta/YYYYY . Tidak ada header 'Access-Control-Allow-Origin' yang ada di resource yang diminta. Oleh karena itu, asal 'null' tidak diizinkan mengakses. Responsnya memiliki kode status HTTP 403.
Saya mencoba MENDAPATKAN URL melalui Postman dan itu menunjukkan header di atas berhasil dilewatkan:
Dan dari jawaban OPTIONS:
Bagaimana cara memanggil API saya dari browser tanpa kembali ke JSON-P?
Bucket Policy
? Pastikan Anda memiliki metode dalam kebijakan AndaJawaban:
Saya mendapatkan masalah yang sama. Saya telah menggunakan 10 jam untuk mencari tahu.
https://serverless.com/framework/docs/providers/aws/events/apigateway/
// handler.js 'use strict'; module.exports.hello = function(event, context, callback) { const response = { statusCode: 200, headers: { "Access-Control-Allow-Origin" : "*", // Required for CORS support to work "Access-Control-Allow-Credentials" : true // Required for cookies, authorization headers with HTTPS }, body: JSON.stringify({ "message": "Hello World!" }) }; callback(null, response); };
sumber
Jika ada orang lain yang masih mengalami masalah ini - saya dapat melacak akar penyebabnya di aplikasi saya.
Jika Anda menjalankan API-Gateway dengan Otorisasi khusus - API-Gateway akan mengirim kembali 401 atau 403 sebelum benar-benar mengenai server Anda. Secara default - API-Gateway TIDAK dikonfigurasikan untuk CORS saat mengembalikan 4xx dari pemberi otorisasi khusus.
Juga - jika Anda kebetulan mendapatkan kode status
0
atau1
dari permintaan yang berjalan melalui API Gateway, ini mungkin masalah Anda.Untuk memperbaiki - dalam konfigurasi API Gateway - buka "Gateway Responses", luaskan "Default 4XX" dan tambahkan header konfigurasi CORS di sana. yaitu
Access-Control-Allow-Origin: '*'
Pastikan untuk menerapkan ulang gateway Anda - dan voila!
sumber
aws apigateway update-gateway-response --rest-api-id "XXXXXXXXX" --response-type "DEFAULT_4XX" --patch-operations op="add",path="/responseParameters/gatewayresponse.header.Access-Control-Allow-Origin",value='"'"'*'"'"'
1) Saya perlu melakukan hal yang sama seperti @riseres dan beberapa perubahan lainnya. Ini adalah header tanggapan saya:
headers: { 'Access-Control-Allow-Origin' : '*', 'Access-Control-Allow-Headers':'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token', 'Access-Control-Allow-Credentials' : true, 'Content-Type': 'application/json' }
2) Dan
Menurut dokumentasi ini:
http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html
Saat Anda menggunakan proxy untuk fungsi lambda pada konfigurasi API Gateway, metode posting atau get tidak memiliki header tambahan, hanya opsinya saja. Anda harus melakukannya secara manual dalam respons (respons server atau lambda).
3) Dan
Selain itu, saya perlu menonaktifkan opsi 'API Key Diperlukan' dalam metode posting gateway API saya.
sumber
Jika Anda telah mencoba segala sesuatu tentang masalah ini tetapi tidak berhasil, Anda akan berakhir seperti yang saya lakukan. Ternyata, arah penyiapan CORS Amazon yang ada berfungsi dengan baik ... pastikan Anda ingat untuk menerapkan ulang ! Wizard pengeditan CORS, bahkan dengan semua tanda centang hijau kecilnya yang bagus, tidak membuat pembaruan langsung ke API Anda. Mungkin sudah jelas, tapi itu membuatku bingung selama setengah hari.
sumber
Membuat sampel saya berfungsi: Saya baru saja memasukkan 'Access-Control-Allow-Origin': '*', di dalam header: {} di fungsi Lambda nodejs yang dihasilkan. Saya tidak membuat perubahan pada lapisan API yang dihasilkan Lambda.
Inilah NodeJS saya:
'use strict'; const doc = require('dynamodb-doc'); const dynamo = new doc.DynamoDB(); exports.handler = ( event, context, callback ) => { const done = ( err, res ) => callback( null, { statusCode: err ? '400' : '200', body: err ? err.message : JSON.stringify(res), headers:{ 'Access-Control-Allow-Origin' : '*' }, }); switch( event.httpMethod ) { ... } };
Ini panggilan AJAX saya
$.ajax({ url: 'https://x.execute-api.x-x-x.amazonaws.com/prod/fnXx?TableName=x', type: 'GET', beforeSend: function(){ $( '#loader' ).show();}, success: function( res ) { alert( JSON.stringify(res) ); }, error:function(e){ alert('Lambda returned error\n\n' + e.responseText); }, complete:function(){ $('#loader').hide(); } });
sumber
Untuk Karyawan Google:
Inilah alasannya:
GET
/POST
tanpa cookie tidak memicu preflightOPTIONS
metode untuk jalur tersebut, kemudian mengirimAllow-Origin
header menggunakan respons tiruan saat pengguna memanggilOPTIONS
, tetapiGET
/POST
tidak akan mendapatkanAllow-Origin
otomatisAllow-Origin
headerOPTIONS
Singkatnya:
OPTIONS
akan dibuat oleh API Gateway secara otomatisOPTIONS
hanya digunakan oleh browser sebagai tindakan pencegahan untuk memeriksa kemungkinan CORS di jalurGET
/POST
sumber
Saya baru saja menambahkan tajuk ke respons fungsi lambda saya dan itu bekerja seperti pesona
exports.handler = async (event) => { const response = { statusCode: 200, body: JSON.stringify('Hey it works'), headers:{ 'Access-Control-Allow-Origin' : '*' } }; return response; };
sumber
Saya menemukan solusi sederhana di dalamnya
API Gateway> Pilih titik akhir API Anda> Pilih metode (dalam kasus saya itu adalah POST)
Sekarang ada TINDAKAN dropdown> Aktifkan CORS .. pilih itu.
Sekarang pilih TINDAKAN dropdown lagi> Terapkan API (terapkan kembali)
Berhasil!
sumber
Saya membuat milik saya berfungsi setelah saya menyadari bahwa lambda authoriser gagal dan untuk beberapa alasan yang tidak diketahui itu diterjemahkan menjadi kesalahan CORS. Perbaikan sederhana untuk penulis otorisasi saya (dan beberapa pengujian penulis otorisasi yang seharusnya saya tambahkan sejak awal) dan berhasil. Bagi saya, tindakan API Gateway 'Aktifkan CORS' diperlukan. Ini menambahkan semua tajuk dan pengaturan lain yang saya butuhkan di API saya.
sumber
Bagi saya, jawaban yang AKHIRNYA BEKERJA, adalah komentar dari James Shapiro dari jawaban Alex R (suara terbanyak kedua). Saya masuk ke masalah API Gateway ini pertama-tama, dengan mencoba mendapatkan halaman web statis yang dihosting di S3 untuk menggunakan lambda untuk memproses halaman hubungi kami dan mengirim email. Cukup dengan memeriksa [] Default 4XX memperbaiki pesan kesalahan.
sumber
Setelah Mengubah Fungsi atau Kode Anda Ikuti dua langkah berikut.
Pertama Aktifkan CORS Kemudian Terapkan API setiap saat.
sumber
Menerapkan kode setelah mengaktifkan CORS untuk keduanya
POST
danOPTIONS
berhasil untuk saya.sumber
Saya sedang menjalankan
aws-serverless-express
, dan dalam kasus saya perlu mengeditsimple-proxy-api.yaml
.Sebelum CORS dikonfigurasi ke
https://example.com
, saya baru saja menukar nama situs saya dan menerapkan ulang melaluinpm run setup
, dan itu memperbarui lambda / stack saya yang ada.#... /: #... method.response.header.Access-Control-Allow-Origin: "'https://example.com'" #... /{proxy+}: method.response.header.Access-Control-Allow-Origin: "'https://example.com'" #...
sumber
Dalam kasus saya, karena saya menggunakan AWS_IAM sebagai metode Otorisasi untuk API Gateway, saya perlu memberikan izin peran IAM saya untuk mencapai titik akhir.
sumber
Akar penyebab lain dari masalah ini mungkin adalah perbedaan antara HTTP / 1.1 dan HTTP / 2.
Gejala: Beberapa pengguna, tidak semuanya, dilaporkan mendapatkan kesalahan CORS saat menggunakan Perangkat Lunak kami.
Masalah: The
Access-Control-Allow-Origin
sundulan hilang kadang-kadang .Konteks: Kami memiliki Lambda di tempat, yang didedikasikan untuk menangani
OPTIONS
permintaan dan membalas dengan header CORS yang sesuai, sepertiAccess-Control-Allow-Origin
mencocokkan yang masuk daftar putihOrigin
.Solusi: API Gateway tampaknya mengubah semua header menjadi huruf kecil untuk panggilan HTTP / 2, tetapi mempertahankan kapitalisasi untuk HTTP / 1.1. Ini menyebabkan akses
event.headers.origin
gagal.Periksa apakah Anda juga mengalami masalah ini:
Dengan asumsi API Anda terletak di
https://api.example.com
, dan front-end Anda dihttps://www.example.com
. Menggunakan CURL, buat permintaan menggunakan HTTP / 2:curl -v -X OPTIONS -H 'Origin: https://www.example.com' https://api.example.com
Output respon harus menyertakan tajuk:
< Access-Control-Allow-Origin: https://www.example.com
Ulangi langkah yang sama menggunakan HTTP / 1.1 (atau dengan
Origin
header huruf kecil ):curl -v -X OPTIONS --http1.1 -H 'Origin: https://www.example.com' https://api.example.com
Jika
Access-Control-Allow-Origin
header hilang, Anda mungkin ingin memeriksa sensitivitas huruf saat membacaOrigin
header.sumber
Selain komentar lain, sesuatu yang harus diperhatikan adalah status yang dikembalikan dari integrasi yang mendasarinya dan jika header Access-Control-Allow-Origin dikembalikan untuk status itu.
Melakukan hal 'Aktifkan CORS' hanya menyiapkan 200 status. Jika Anda memiliki endpoint lain, misalnya 4xx dan 5xx, Anda perlu menambahkan header sendiri.
sumber
Dalam kasus saya, saya hanya salah menulis URL permintaan pengambilan. Aktif
serverless.yml
, Anda menyetelcors
ketrue
:register-downloadable-client: handler: fetch-downloadable-client-data/register.register events: - http: path: register-downloadable-client method: post integration: lambda cors: true stage: ${self:custom.stage}
dan kemudian pada penangan lambda Anda mengirim header, tetapi jika Anda membuat permintaan pengambilan yang salah di frontend, Anda tidak akan mendapatkan header tersebut pada respons dan Anda akan mendapatkan kesalahan ini. Jadi, periksa kembali URL permintaan Anda di bagian depan.
sumber
Dengan Python Anda bisa melakukannya seperti pada kode di bawah ini:
{ "statusCode" : 200, 'headers': {'Content-Type': 'application/json', 'Access-Control-Allow-Origin': "*" }, "body": json.dumps( { "temperature" : tempArray, "time": timeArray }) }
sumber