Sebelum menggunakan emulator Authentication dengan aplikasi, pastikan Anda memahami keseluruhan alur kerja Firebase Local Emulator Suite, dan sudah menginstal serta mengonfigurasi Local Emulator Suite dan mengetahui perintah CLI-nya.
Topik ini mengasumsikan bahwa Anda sudah memahami pengembangan solusi Firebase Authentication yang digunakan untuk produksi. Jika diperlukan, tinjau dokumentasi untuk kombinasi teknik platform dan autentikasi Anda.
Apa yang dapat saya lakukan dengan emulator Authentication?
Emulator Authentication menyediakan emulasi lokal berakurasi tinggi untuk layanan Firebase Authentication, yang menyediakan sebagian besar fungsionalitas yang ditemukan dalam Firebase Authentication produksi. Jika dipasangkan dengan Firebase SDK untuk platform Apple, Android, dan Web, emulator ini dapat Anda gunakan untuk:
- Membuat, memperbarui, dan mengelola akun pengguna yang diemulasi untuk menguji email/sandi, nomor telepon/SMS, multi-faktor SMS, dan autentikasi penyedia identitas (misalnya Google) pihak ketiga
- Melihat dan mengedit pengguna yang diemulasi
- Membuat prototipe sistem autentikasi token kustom
- Memeriksa pesan terkait autentikasi di tab Logs pada UI Emulator.
Memilih project Firebase
Firebase Local Emulator Suite mengemulasi produk untuk satu project Firebase.
Untuk memilih project yang akan digunakan, sebelum memulai emulator, jalankan firebase use
di CLI di direktori kerja Anda. Atau, Anda dapat meneruskan flag --project
ke setiap perintah emulator.
Local Emulator Suite mendukung emulasi project Firebase sungguhan dan project demo.
Jenis project | Fitur | Penggunaan dengan emulator |
---|---|---|
Sungguhan |
Project Firebase sungguhan adalah project yang Anda buat dan konfigurasikan (kemungkinan besar melalui Firebase console). Project sungguhan memiliki resource live, seperti instance database, bucket penyimpanan, fungsi, atau resource lain yang Anda siapkan untuk project Firebase tersebut. |
Jika mengerjakan project Firebase sungguhan, Anda dapat menjalankan emulator untuk salah satu atau semua produk yang didukung. Untuk produk yang tidak diemulasi, aplikasi dan kode Anda akan berinteraksi dengan resource live (instance database, bucket penyimpanan, fungsi, dsb.). |
Demo |
Project Firebase demo tidak memiliki konfigurasi Firebase sungguhan dan tidak memiliki resource live. Project ini biasanya diakses melalui codelab atau tutorial lainnya. Project ID untuk project demo memiliki awalan |
Jika menggunakan project Firebase demo, aplikasi dan kode Anda hanya berinteraksi dengan emulator. Jika aplikasi Anda mencoba berinteraksi dengan resource yang tidak dijalankan dengan emulator, kode tersebut akan gagal. |
Jika memungkinkan, sebaiknya gunakan project demo. Manfaatnya meliputi:
- Penyiapan yang lebih mudah karena Anda dapat menjalankan emulator tanpa perlu membuat project Firebase
- Keamanan yang lebih tangguh karena jika kode Anda tidak sengaja memanggil resource yang tidak diemulasi (production), tidak akan terjadi perubahan data, penggunaan, dan penagihan
- Dukungan offline yang lebih baik karena Anda tidak perlu mengakses internet untuk mendownload konfigurasi SDK.
Melengkapi aplikasi untuk berkomunikasi dengan emulator
Android SDK, iOS SDK, dan web SDK
Siapkan konfigurasi dalam aplikasi atau class pengujian untuk berinteraksi dengan emulator Authentication seperti berikut.
Kotlin+KTX
Firebase.auth.useEmulator("10.0.2.2", 9099)
Java
FirebaseAuth.getInstance().useEmulator("10.0.2.2", 9099);
Swift
Auth.auth().useEmulator(withHost:"127.0.0.1", port:9099)
Web
import { getAuth, connectAuthEmulator } from "firebase/auth"; const auth = getAuth(); connectAuthEmulator(auth, "http://127.0.0.1:9099");
Web
const auth = firebase.auth(); auth.useEmulator("http://127.0.0.1:9099");
Tidak diperlukan penyiapan tambahan untuk membuat prototipe dan menguji interaksi antara Authentication dan Cloud Functions atau Aturan Keamanan Firebase untuk Cloud Firestore atau Realtime Database. Saat emulator Authentication dikonfigurasi dan emulator lain berjalan, keduanya otomatis bekerja sama.
Admin SDK
Firebase Admin SDK secara otomatis terhubung ke emulator Authentication jika variabel lingkungan FIREBASE_AUTH_EMULATOR_HOST
ditetapkan.
export FIREBASE_AUTH_EMULATOR_HOST="127.0.0.1:9099"
Perlu diperhatikan bahwa emulator Cloud Functions otomatis mengenali emulator Authentication, sehingga Anda dapat melewatkan langkah ini saat menguji integrasi antara emulator Cloud Functions dan emulator Authentication. Variabel lingkungan akan ditetapkan secara otomatis untuk Admin SDK di Cloud Functions.
Dengan variabel lingkungan yang telah ditetapkan, Firebase Admin SDK akan menerima Token ID yang tidak bertanda tangan dan cookie sesi yang dikeluarkan oleh emulator Authentication (masing-masing melalui metode verifyIdToken
dan createSessionCookie
) untuk memfasilitasi pengujian dan pengembangan lokal. Pastikan Anda tidak menetapkan variabel lingkungan dalam produksi.
Jika ingin kode Admin SDK terhubung ke emulator bersama yang berjalan di lingkungan lain, Anda harus menentukan project ID yang sama dengan yang ditetapkan menggunakan Firebase CLI. Anda dapat meneruskan project ID ke initializeApp
secara langsung atau menetapkan variabel lingkungan GCLOUD_PROJECT
.
Admin SDK Node.js
admin.initializeApp({ projectId: "your-project-id" });
Variabel Lingkungan
export GCLOUD_PROJECT="your-project-id"
Token ID
Untuk alasan keamanan, emulator Authentication mengeluarkan token ID tidak bertanda tangan yang hanya diterima oleh emulator Firebase lain, atau Firebase Admin SDK saat dikonfigurasi. Token ini akan ditolak oleh layanan Firebase produksi atau Firebase Admin SDK yang berjalan dalam mode produksi (misalnya perilaku default tanpa langkah penyiapan yang dijelaskan di atas).
Mulai emulator
Anda dapat menggunakan emulator Authentication secara interaktif melalui UI Emulator Suite dan secara non-interaktif melalui antarmuka REST lokalnya. Bagian berikut mencakup kasus penggunaan interaktif dan non-interaktif.
Untuk memulai emulator Authentication, antarmuka REST-nya, dan UI Emulator Suite, jalankan:
firebase emulators:start
Autentikasi anonim, link email, dan email yang diemulasi
Untuk autentikasi anonim, aplikasi Anda dapat menjalankan logika login untuk platform Anda (iOS, Android, web).
Untuk autentikasi email/sandi, Anda dapat mulai membuat prototipe dengan menambahkan akun pengguna ke emulator Authentication dari aplikasi menggunakan metode Authentication SDK, atau dengan menggunakan UI Emulator Suite.
- Di UI Emulator Suite, klik tab Authentication.
- Klik tombol Add user.
- Ikuti wizard pembuatan akun pengguna, lalu isi kolom autentikasi email.
Setelah pengguna uji dibuat, aplikasi dapat memproses login dan logout pengguna tersebut dengan logika SDK untuk platform Anda (iOS, Android, web).
Untuk menguji alur verifikasi email/login dengan link email, emulator akan mencetak URL ke terminal tempat firebase emulators:start
dieksekusi.
i To verify the email address customer@ex.com, follow this link:
http://127.0.0.1:9099/emulator/action?mode=verifyEmail&lang=en&oobCode=XYZ123&apiKey=fake-api-key
Tempelkan link tersebut ke browser Anda untuk menyimulasikan peristiwa verifikasi, dan periksa apakah verifikasi berhasil.
{
"authEmulator": {
"success": "The email has been successfully verified.",
"email": "customer@example.com"
}
}
Untuk menguji reset sandi, emulator akan mencetak URL yang mirip, termasuk parameter newPassword (yang dapat Anda ubah sesuai kebutuhan), ke terminal.
http://127.0.0.1:9099/emulator/action?mode=resetPassword&oobCode=XYZ!23&apiKey=fake-api-key&newPassword=YOUR_NEW_PASSWORD
Pengujian noninteraktif
Sebagai ganti penggunaan UI Emulator Suite atau kode klien untuk mengelola akun pengguna email/sandi, Anda dapat menulis skrip penyiapan pengujian yang memanggil REST API untuk membuat dan menghapus akun pengguna serta mengambil kode verifikasi email out-of-band untuk mengisi URL verifikasi email emulator. Tindakan ini akan membuat platform dan kode pengujian tetap terpisah dan memungkinkan Anda menguji secara noninteraktif.
Untuk alur pengujian email dan sandi noninteraktif, urutan umumnya adalah sebagai berikut.
- Membuat pengguna dengan endpoint REST signUp Authentication.
- Memproses login pengguna menggunakan email dan sandi untuk melakukan pengujian.
- Jika berlaku untuk pengujian Anda, mengambil kode verifikasi email out-of-band yang tersedia dari endpoint REST khusus emulator.
- Menghapus data pengguna dengan endpoint REST khusus emulator untuk menghapus data.
Autentikasi ponsel/SMS yang diemulasi
Untuk autentikasi ponsel, emulator Auth tidak mendukung:
- Alur reCAPTCHA dan APN. Setelah dikonfigurasi untuk berinteraksi dengan emulator, SDK klien akan menonaktifkan metode verifikasi ini dengan cara yang mirip seperti yang dijelaskan untuk pengujian integrasi (iOS, Android, web).
- Nomor telepon uji coba dengan kode yang telah dikonfigurasi di Firebase console.
Di luar itu, dalam hal kode klien, alur autentikasi ponsel/SMS sama persis dengan alur yang dijelaskan untuk produksi (iOS, Android, web).
Dengan menggunakan UI Emulator Suite:
- Di UI Emulator Suite, klik tab Authentication.
- Klik tombol Add user.
- Ikuti wizard pembuatan akun pengguna, lalu isi kolom autentikasi ponsel.
Namun, untuk alur autentikasi ponsel, emulator TIDAK akan memicu pengiriman SMS apa pun, karena menghubungi operator berada di luar cakupan dan tidak cocok untuk pengujian lokal. Sebagai gantinya, emulator akan mencetak kode yang seharusnya dikirim melalui SMS ke terminal yang sama dengan tempat Anda menjalankan firebase emulators:start
; masukkan kode ini ke aplikasi untuk menyimulasikan pengguna yang memeriksa SMS mereka.
Pengujian noninteraktif
Untuk pengujian autentikasi ponsel noninteraktif, gunakan REST API emulator Authentication untuk mengambil kode SMS yang tersedia. Perlu diperhatikan bahwa kode selalu berbeda setiap kali Anda memulai alur.
Urutan umumnya adalah sebagai berikut.
- Memanggil
signInWithPhoneNumber
platform untuk memulai proses verifikasi. - Mengambil kode verifikasi menggunakan endpoint REST khusus emulator.
- Memanggil
confirmationResult.confirm(code)
seperti biasa dengan kode verifikasi.
SMS multi-faktor
Emulator Authentication mendukung pembuatan prototipe dan pengujian alur autentikasi multi-faktor (MFA) SMS yang tersedia dalam produksi untuk iOS, Android, dan web.
Saat menambahkan pengguna tiruan ke emulator, Anda dapat mengaktifkan MFA dan mengonfigurasi satu
atau beberapa nomor telepon yang akan dikirimi pesan SMS faktor kedua. Pesan merupakan output ke terminal yang sama dengan tempat Anda menjalankan firebase emulators:start
, dan tersedia dari antarmuka REST.
Autentikasi penyedia identitas (IDP) pihak ketiga yang diemulasi
Dengan emulator Authentication, Anda dapat menguji banyak alur autentikasi pihak ketiga di aplikasi web, Android, atau iOS tanpa perubahan dari kode produksi. Untuk mengetahui contoh alur autentikasi, lihat dokumentasi untuk berbagai kombinasi penyedia dan platform yang dapat digunakan di aplikasi Anda.
Secara umum, Anda dapat menggunakan Firebase SDK untuk melakukan autentikasi dengan salah satu dari dua cara berikut:
- Aplikasi Anda mengizinkan SDK menangani seluruh proses, termasuk semua interaksi dengan penyedia identitas pihak ketiga untuk mengambil kredensial.
- Aplikasi Anda mengambil kredensial secara manual dari penyedia pihak ketiga menggunakan SDK pihak tersebut dan meneruskan kredensial tersebut ke Authentication SDK.
Sekali lagi, periksa link dokumentasi di atas dan pastikan Anda memahami alur mana pun yang ingin digunakan (yaitu, pengambilan kredensial manual atau pengambilan kredensial yang dikelola oleh Firebase SDK). Emulator Authentication mendukung pengujian untuk pendekatan mana pun.
Menguji alur IDP berbasis Firebase SDK
Jika aplikasi Anda menggunakan alur menyeluruh Firebase SDK, seperti OAuthProvider
guna login dengan Microsoft, GitHub, atau Yahoo, untuk pengujian interaktif, emulator Authentication akan menyalurkan versi lokal halaman login yang sesuai untuk membantu Anda menguji autentikasi dari aplikasi web yang memanggil metode signinWithPopup
atau signInWithRedirect
. Halaman login yang disalurkan secara lokal ini juga muncul di aplikasi seluler, yang dirender oleh library webview platform Anda.
Emulator membuat kredensial dan akun pengguna pihak ketiga fiktif yang diperlukan seiring perjalanan alur.
Menguji alur IDP dengan pengambilan kredensial manual
Jika Anda menggunakan teknik login "manual" dan memanggil metode signInWithCredentials
platform Anda, aplikasi seperti biasanya akan meminta login pihak ketiga sungguhan dan mengambil kredensial pihak ketiga sungguhan.
Perlu diperhatikan bahwa emulator hanya mendukung autentikasi signInWithCredential
untuk kredensial yang diambil dari Login dengan Google, Apple, dan penyedia lainnya yang menggunakan token ID yang diterapkan sebagai Token Web JSON (JWT). Token akses (misalnya, yang disediakan oleh Facebook atau Twitter, yang bukan JWT) tidak didukung. Bagian berikutnya akan membahas cara alternatif dalam kasus ini.
Pengujian noninteraktif
Salah satu pendekatan untuk pengujian noninteraktif adalah mengotomatiskan klik pengguna pada halaman login yang disalurkan oleh emulator. Untuk aplikasi web, gunakan antarmuka kontrol, misalnya WebDriver. Untuk seluler, gunakan alat pengujian UI dari platform Anda, seperti Espresso atau Xcode.
Atau, Anda dapat mengubah kode agar menggunakan signInWithCredential
(misalnya, di cabang kode) dan menggunakan alur autentikasi token dengan token ID fiktif untuk akun, bukan kredensial sungguhan.
- Hubungkan ulang atau jadikan bagian kode Anda yang mengambil idToken dari IDP sebagai komentar. Dengan melakukan tindakan ini, Anda tidak perlu memasukkan nama pengguna dan sandi sebenarnya selama pengujian, serta membebaskan pengujian dari kuota dan batas kapasitas API pada IDP.
- Kedua, gunakan string JSON literal sebagai pengganti token untuk
signInWithCredential
. Dengan web SDK sebagai contoh, Anda dapat mengubah kode menjadi:
firebase.auth().signInWithCredential(firebase.auth.GoogleAuthProvider.credential(
'{"sub": "abc123", "email": "foo@example.com", "email_verified": true}'
));
Saat digunakan dengan emulator, kode ini akan berhasil mengautentikasi pengguna dengan email foo@example.com
di Google. Anggaplah sub kolomnya sebagai kunci utama yang dapat diubah menjadi string apa pun, sehingga meniru pemrosesan login berbagai pengguna. Anda dapat mengganti firebase.auth.GoogleAuthProvider
dengan, misalnya, new firebase.auth.OAuthProvider('yahoo.com')
atau ID penyedia lainnya yang ingin Anda tiru.
Autentikasi token kustom yang diemulasi
Emulator Authentication menangani autentikasi dengan Token Web JSON kustom menggunakan panggilan ke metode signInWithCustomToken
di platform yang didukung, seperti yang dijelaskan dalam dokumentasi Autentikasi produksi.
Perbedaan emulator Authentication dengan produksi
Emulator Firebase Authentication menyimulasikan banyak fitur produk produksi. Namun, karena segala jenis sistem autentikasi sangat bergantung pada keamanan di beberapa tingkat (perangkat, penyedia pihak ketiga, Firebase, dll.), sulit bagi emulator untuk membuat ulang semua alur dengan benar.
Cloud IAM
Firebase Emulator Suite tidak berupaya mereplikasi atau mematuhi perilaku terkait IAM dalam beroperasi. Emulator mematuhi Aturan Keamanan Firebase yang diberikan. Namun, dalam situasi saat IAM biasanya digunakan, misalnya untuk menyetel akun layanan yang memanggil Cloud Functions serta izinnya, emulator tidak dapat dikonfigurasi dan akan menggunakan akun yang tersedia secara global di mesin developer Anda. Ini serupa dengan menjalankan skrip lokal secara langsung.
Login melalui link email di perangkat seluler
Karena pada platform seluler, proses login dengan link email bergantung pada Firebase Dynamic Links, semua link tersebut akan dibuka di platform web (seluler).
Login pihak ketiga
Untuk alur login pihak ketiga, Firebase Authentication mengandalkan kredensial aman dari penyedia pihak ketiga, seperti Twitter dan GitHub.
Kredensial asli dari penyedia OpenID Connect, seperti Google dan Apple, diterima oleh emulator Authentication. Kredensial dari penyedia non-OpenID Connect tidak didukung.
Login dengan Email/SMS
Dalam aplikasi produksi, alur login dengan email dan SMS melibatkan operasi asinkron. Dalam operasi tersebut, pengguna memeriksa pesan yang diterima dan memasukkan kode login ke antarmuka login. Emulator Authentication tidak mengirim pesan email atau SMS apa pun. Namun, seperti yang dijelaskan di atas, emulator ini menghasilkan kode login dan mengeluarkannya ke terminal untuk digunakan dalam pengujian.
Emulator tidak mendukung kemampuan untuk menentukan nomor telepon pengujian dengan kode login tetap seperti yang dapat dilakukan menggunakan Firebase console.
Autentikasi token kustom
Emulator Authentication tidak memvalidasi tanda tangan atau masa berlaku token kustom. Hal ini memungkinkan Anda untuk menggunakan token buatan tangan dan menggunakan kembali token tanpa batas dalam skenario pembuatan prototipe dan pengujian.
Pembatasan kapasitas/anti-penyalahgunaan
Emulator Authentication tidak mereplikasi fitur pembatasan kapasitas produksi atau anti-penyalahgunaan.
Memblokir fungsi
Dalam produksi, pengguna ditulis ke penyimpanan satu kali setelah peristiwa beforeCreate
dan beforeSignIn
dipicu. Namun, karena keterbatasan teknis, penulisan yang dilakukan emulator Authentication hanya dapat disimpan dua kali, sekali setelah pembuatan pengguna dan yang satu lagi setelah login. Artinya, Anda dapat memanggil getAuth().getUser()
di beforeSignIn
dalam emulator Authentication tanpa hambatan untuk pengguna baru. Namun, error akan terjadi saat Anda melakukannya dalam produksi.
Apa selanjutnya?
Untuk melihat kumpulan video pilihan dan contoh petunjuk terperinci, ikuti Playlist Pelatihan Emulator Firebase.
Karena fungsi yang dipicu merupakan integrasi standar dengan Authentication, pelajari lebih lanjut emulator Cloud Functions for Firebase di artikel Menjalankan fungsi secara lokal.