Dengan fungsi cloud firebase baru saya telah memutuskan untuk memindahkan beberapa endpoint HTTP saya ke firebase. Semuanya berfungsi dengan baik ... Tetapi saya memiliki masalah berikut. Saya memiliki dua titik akhir yang dibangun oleh HTTP Triggers (Cloud Functions)
- Titik akhir API untuk membuat pengguna dan mengembalikan Token khusus yang dihasilkan oleh Firebase Admin SDK.
- Titik akhir API untuk mengambil detail pengguna tertentu.
Meskipun titik akhir pertama baik-baik saja, tetapi untuk titik akhir kedua saya ingin melindunginya hanya untuk pengguna yang diautentikasi. artinya seseorang yang memiliki token yang saya hasilkan sebelumnya.
Bagaimana saya menyelesaikan masalah ini?
Saya tahu kita bisa mendapatkan parameter Header di fungsi cloud menggunakan
request.get('x-myheader')
tetapi apakah ada cara untuk melindungi titik akhir seperti melindungi basis data waktu nyata?
firebase
firebase-realtime-database
firebase-authentication
firebase-security
google-cloud-functions
spaceMonkey
sumber
sumber
Jawaban:
Ada contoh kode resmi untuk apa yang Anda coba lakukan. Apa yang diilustrasikannya adalah bagaimana mengatur fungsi HTTPS Anda untuk meminta header Otorisasi dengan token yang diterima klien selama otentikasi. Fungsi ini menggunakan pustaka firebase-admin untuk memverifikasi token.
Selain itu, Anda dapat menggunakan " fungsi yang dapat dipanggil " untuk membuat banyak boilerplate ini lebih mudah, jika aplikasi Anda dapat menggunakan pustaka klien Firebase.
sumber
Seperti yang disebutkan oleh @Doug, Anda dapat menggunakan
firebase-admin
untuk memverifikasi token. Saya telah menyiapkan contoh cepat:Pada contoh di atas, saya juga telah mengaktifkan CORS, tetapi itu opsional. Pertama, Anda mendapatkan
Authorization
tajuk dan mencari tahutoken
.Kemudian, Anda dapat menggunakan
firebase-admin
untuk memverifikasi token itu. Anda akan mendapatkan informasi yang diterjemahkan untuk pengguna itu dalam respons. Kalau tidak, jika token tidak valid, itu akan menimbulkan kesalahan.sumber
getIdToken()
metode ini di sisi klien (mis.firebase.auth().currentUser.getIdToken().then(token => console.log(token))
) Firebase docsSeperti juga disebutkan oleh @Doug, Anda dapat menggunakan Fungsi Callable untuk mengecualikan beberapa kode boilerplate dari klien Anda dan server Anda.
Fungsi callable exampale:
Itu dapat dipanggil langsung dari klien Anda seperti:
sumber
Metode di atas mengautentikasi pengguna menggunakan logika di dalamnya dalam fungsi, sehingga fungsi tersebut masih harus dipanggil untuk melakukan pemeriksaan.
Itu metode yang sangat bagus, tetapi demi kelengkapan, ada alternatif lain:
Anda dapat mengatur fungsi menjadi "pribadi" sehingga tidak dapat dipanggil kecuali oleh pengguna terdaftar (Anda memutuskan izin). Dalam kasus ini, permintaan yang tidak diautentikasi ditolak di luar konteks fungsi, dan fungsi tersebut tidak dipanggil sama sekali.
Berikut adalah referensi untuk (a) Mengonfigurasi fungsi sebagai publik / pribadi , dan kemudian (b) mengautentikasi pengguna akhir ke fungsi Anda .
Perhatikan bahwa dokumen di atas adalah untuk Google Cloud Platform, dan memang, ini berhasil karena setiap proyek Firebase juga merupakan proyek GCP. Peringatan terkait dengan metode ini adalah bahwa, pada saat penulisan, ini hanya berfungsi dengan otentikasi berbasis akun Google.
sumber
Ada contoh resmi yang bagus tentang hal itu menggunakan Express - mungkin berguna di masa depan: https://github.com/firebase/functions-samples/blob/master/authorized-https-endpoint/functions/index.js (disisipkan di bawah ini hanya tentunya)
Ingatlah bahwa
exports.app
membuat fungsi Anda tersedia di bawah/app
siput (dalam hal ini hanya ada satu fungsi dan tersedia di bawah<you-firebase-app>/app/hello
. Untuk menyingkirkannya Anda sebenarnya perlu menulis ulang bagian Express sedikit (bagian middleware untuk validasi tetap sama - itu berfungsi sangat bagus dan cukup bisa dimengerti berkat komentar).Penulisan ulang saya untuk menyingkirkan
/app
:sumber
Saya telah berjuang untuk mendapatkan otentikasi firebase yang tepat dalam fungsi GCP golang. Sebenarnya tidak ada contoh untuk itu, jadi saya memutuskan untuk membangun perpustakaan kecil ini: https://github.com/Jblew/go-firebase-auth-in-gcp-functions
Sekarang Anda dapat dengan mudah mengautentikasi pengguna menggunakan firebase-auth (yang berbeda dari fungsi-fungsi yang diautentikasi gcp dan tidak secara langsung didukung oleh proxy-aware-proxy).
Berikut adalah contoh penggunaan utilitas:
Hanya perlu diingat untuk menyebarkan fungsi Anda dengan
--allow-unauthenticated
flag (karena otentikasi firebase terjadi di dalam eksekusi fungsi).Semoga ini bisa membantu Anda karena itu membantu saya. Saya bertekad untuk menggunakan golang untuk fungsi cloud untuk alasan kinerja - Jędrzej
sumber
Di Firebase, untuk menyederhanakan kode dan pekerjaan Anda, itu hanya masalah desain arsitektur :
Express
. Untuk membatasi hanya samesite atau situs tertentu saja , gunakanCORS
untuk mengontrol aspek keamanan ini. Ini masuk akal karenaExpress
berguna untuk SEO karena konten rendering sisi servernya.context
parameter untuk menyimpan semua kerepotan. Ini juga masuk akal, karena seperti Aplikasi Halaman Tunggal yang dibangun dengan AngularJS - AngularJS buruk untuk SEO, tetapi karena ini adalah aplikasi yang dilindungi kata sandi, Anda juga tidak memerlukan banyak SEO. Sedangkan untuk templating, AngularJS memiliki templating bawaan, jadi tidak perlu untuk template sisi-potongExpress
. Maka Firebase Callable Functions harus cukup baik.Dengan pemikiran di atas, tidak ada lagi kerumitan dan membuat hidup lebih mudah.
sumber