Menghubungkan aplikasi ke Emulator Authentication

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 demo-.

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)

API modular web

import { getAuth, connectAuthEmulator } from "firebase/auth";

const auth = getAuth();
connectAuthEmulator(auth, "http://127.0.0.1:9099");

API dengan namespace 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

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.

  1. Di UI Emulator Suite, klik tab Authentication.
  2. Klik tombol Add user.
  3. 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.

  1. Membuat pengguna dengan endpoint REST signUp Authentication.
  2. Memproses login pengguna menggunakan email dan sandi untuk melakukan pengujian.
  3. Jika berlaku untuk pengujian Anda, mengambil kode verifikasi email out-of-band yang tersedia dari endpoint REST khusus emulator.
  4. 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:

  1. Di UI Emulator Suite, klik tab Authentication.
  2. Klik tombol Add user.
  3. 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.

  1. Memanggil signInWithPhoneNumber platform untuk memulai proses verifikasi.
  2. Mengambil kode verifikasi menggunakan endpoint REST khusus emulator.
  3. 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.

  1. 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.
  2. 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.

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?