Saat ini saya sedang belajar cara menggunakan Cloud Functions untuk Firebase dan masalah yang saya alami adalah bahwa saya tidak dapat mengakses fungsi yang saya tulis melalui permintaan AJAX. Saya mendapatkan kesalahan "Tidak Ada 'Akses-Kontrol-Izinkan-Asal'". Berikut ini contoh fungsi yang saya tulis:
exports.test = functions.https.onRequest((request, response) => {
response.status(500).send({test: 'Testing functions'});
})
Fungsi duduk di url ini: https://us-central1-fba-shipper-140ae.cloudfunctions.net/test
Firebase docs menyarankan untuk menambahkan CORS middleware di dalam fungsi, saya sudah mencobanya tetapi tidak berfungsi untuk saya: https://firebase.google.com/docs/functions/http-events
Beginilah cara saya melakukannya:
var cors = require('cors');
exports.test = functions.https.onRequest((request, response) => {
cors(request, response, () => {
response.status(500).send({test: 'Testing functions'});
})
})
Apa yang saya lakukan salah? Saya akan menghargai bantuan apa pun dengan ini.
MEMPERBARUI:
Jawaban Doug Stevenson membantu. Menambahkan ({asal: true}) tetap masalah, saya juga harus berubah response.status(500)
untuk response.status(200)
yang saya benar-benar ketinggalan pada awalnya.
sumber
Jawaban:
Ada dua fungsi sampel yang disediakan oleh tim Firebase yang menunjukkan penggunaan CORS:
Sampel kedua menggunakan cara kerja yang berbeda dengan kor daripada yang Anda gunakan saat ini.
Juga, pertimbangkan mengimpor seperti ini, seperti yang ditunjukkan dalam sampel:
sumber
origin: true
meninggalkannya karena ini tidak akan berhasilorigin: true
memungkinkan setiap domain untuk mengakses? ( npmjs.com/package/cors ) @ Patrick Stevenson Apakah Anda pikir firebase dapat menulis dokumen tentang dasar-dasar yang diperlukan untuk fungsi https klien / server? Repo sampel bagus, tetapi kami telah melewatkan sedikit kebutuhan tambahan ini.Anda dapat mengatur CORS dalam fungsi cloud seperti ini
response.set('Access-Control-Allow-Origin', '*');
Tidak perlu mengimpor
cors
paketsumber
Authorization
header. Di atas tampaknya berfungsi ok.Bagi siapa pun yang mencoba melakukan ini dalam naskah, ini adalah kode:
sumber
Satu info tambahan, hanya demi orang-orang yang googling ini setelah beberapa waktu: Jika Anda menggunakan hosting berbasis web, Anda juga dapat mengatur penulisan ulang, sehingga misalnya url seperti (firebase_hosting_host) / api / myfunction redirect ke ( firebase_cloudfunctions_host) / fungsi doStuff. Dengan begitu, karena pengalihan transparan dan sisi-server, Anda tidak harus berurusan dengan cors.
Anda dapat mengaturnya dengan bagian penulisan ulang di firebase.json:
sumber
Tidak ada solusi CORS yang bekerja untuk saya ... sampai sekarang!
Tidak yakin apakah ada orang lain yang mengalami masalah yang sama dengan saya, tetapi saya mengatur CORS seperti 5 cara berbeda dari contoh yang saya temukan dan sepertinya tidak ada yang berhasil. Saya membuat contoh minimal dengan Plunker untuk melihat apakah itu benar-benar bug, tetapi contohnya berjalan dengan indah. Saya memutuskan untuk memeriksa log fungsi firebase (ditemukan di konsol firebase) untuk melihat apakah itu dapat memberi tahu saya apa pun. Saya memiliki beberapa kesalahan dalam kode server node saya , tidak terkait dengan CORS , bahwa ketika saya debug membebaskan saya dari pesan kesalahan CORS saya . Saya tidak tahu mengapa kesalahan kode yang tidak terkait dengan CORS mengembalikan respons kesalahan CORS, tetapi hal itu membuat saya jatuh ke lubang kelinci yang salah selama beberapa jam ...
tl; dr - periksa log fungsi firebase Anda jika tidak ada solusi CORS yang berfungsi dan debug setiap kesalahan yang Anda miliki
sumber
Error: quota exceeded (Quota exceeded for quota group 'NetworkIngressNonbillable' and limit 'CLIENT_PROJECT-1d' of service 'cloudfunctions.googleapis.com
pada dasarnya kuota gratis terlampaui dan fungsi mengembalikan kesalahan koraccess to external network resources not allowed if the billing account is not enabled
. Setelah mengaktifkan akun penagihan, itu berfungsi dengan baik. Ini juga merupakan salah satu contoh non-kor terkait tetapi kesalahan korsel dilemparkan.Saya punya sedikit tambahan untuk @Andreys menjawab pertanyaannya sendiri.
Tampaknya Anda tidak perlu memanggil fungsi panggil balik dalam
cors(req, res, cb)
fungsi, jadi Anda bisa memanggil modul kors di bagian atas fungsi Anda, tanpa menyematkan semua kode Anda dalam panggilan balik. Ini jauh lebih cepat jika Anda ingin menerapkan kor setelahnya.Jangan lupa untuk inor kors seperti yang disebutkan dalam posting pembukaan:
const cors = require('cors')({origin: true});
sumber
cors(request, response, () => { return response.send("Hello from Firebase!"); });
Ini mungkin bermanfaat. Saya membuat fungsi cloud HTTP firebase dengan express (URL khusus)
Pastikan Anda menambahkan bagian menulis ulang
sumber
Saya baru saja menerbitkan sedikit tentang itu:
https://mhaligowski.github.io/blog/2017/03/10/cors-in-cloud-functions.html
Secara umum, Anda harus menggunakan paket Express CORS , yang memerlukan sedikit peretasan untuk memenuhi persyaratan dalam Fungsi GCF / Firebase.
Semoga itu bisa membantu!
sumber
Jika ada orang seperti saya di luar sana: Jika Anda ingin memanggil fungsi cloud dari proyek yang sama dengan fungsi cloud itu sendiri, Anda dapat init firebase sdk dan gunakan metode onCall. Ini akan menangani segalanya untuk Anda:
Sebut fungsi ini seperti ini:
Firebase docs: https://firebase.google.com/docs/functions/callable
Jika Anda tidak dapat menginisialisasi SDK di sini adalah esensi dari saran lain:
sumber
Menemukan cara untuk mengaktifkan kor tanpa mengimpor perpustakaan 'kor'. Ini juga berfungsi dengan
Typescript
dan mengujinya di chrome versi 81.0.sumber
Untuk apa layak itu aku sedang mengalami masalah yang sama ketika melewati
app
ke dalamonRequest
. Saya menyadari bahwa masalahnya adalah garis miring pada url permintaan untuk fungsi firebase. Express sedang mencari'/'
tetapi saya tidak memiliki garis miring pada fungsi[project-id].cloudfunctions.net/[function-name]
. Kesalahan CORS adalah negatif palsu. Ketika saya menambahkan garis miring, saya mendapat respons yang saya harapkan.sumber
[project-id]
karena ini adalah masalah yang saya hadapiHanya cara ini yang berfungsi untuk saya karena saya memiliki otorisasi dalam permintaan saya:
sumber
Jika Anda tidak / tidak bisa menggunakan plugin cors, panggil
setCorsHeaders()
fungsi hal pertama dalam fungsi handler juga akan berfungsi.Juga gunakan fungsi respondSuccess / Error saat membalas kembali.
sumber
Jika Anda menguji aplikasi firebase secara lokal, maka Anda perlu mengarahkan fungsi ke
localhost
bukan cloud. Secara default,firebase serve
ataufirebase emulators:start
arahkan fungsi ke server alih-alih localhost saat Anda menggunakannya di aplikasi web Anda.Tambahkan skrip di bawah dalam kepala html setelah skrip firebase init:
sumber
Mengubah
true
dengan"*"
melakukan trik untuk saya, jadi seperti ini tampilannya:Saya mencoba pendekatan ini karena secara umum, ini adalah bagaimana header respons ini diatur:
Ketahuilah bahwa ini akan memungkinkan domain apa pun untuk memanggil titik akhir Anda karena itu TIDAK aman.
Selain itu, Anda dapat membaca lebih lanjut di dokumen: https://github.com/expressjs/cors
sumber
Jika Anda tidak menggunakan Express atau hanya ingin menggunakan CORS. Kode berikut akan membantu menyelesaikannya
sumber
Dalam kasus saya kesalahan itu disebabkan oleh akses batas fungsi cloud invoker. Silakan tambahkan semua Pengguna ke penyerang fungsi cloud. Harap tautkan tautan . Silakan merujuk ke artikel untuk info lebih lanjut
sumber
Jika tidak ada solusi lain yang berfungsi, Anda dapat mencoba menambahkan alamat di bawah ini di awal panggilan untuk mengaktifkan CORS - redirect:
Kode sampel dengan permintaan JQuery AJAX:
sumber
Menambahkan pengalaman saya. Saya menghabiskan waktu berjam-jam untuk menemukan mengapa saya memiliki kesalahan CORS.
Kebetulan saya mengganti nama fungsi cloud saya (yang pertama saya coba setelah upgrade besar).
Jadi, ketika aplikasi firebase saya memanggil fungsi cloud dengan nama yang salah, seharusnya dilempar kesalahan 404, bukan kesalahan CORS.
Memperbaiki nama fungsi cloud di aplikasi firebase saya memperbaiki masalah ini.
Saya telah mengisi laporan bug tentang ini di sini https://firebase.google.com/support/troubleshooter/report/bugs
sumber