Buka konsol

Menguji Aturan Keamanan dengan Emulator Realtime Database

Emulator Realtime Database dimaksudkan untuk mempermudah penulisan pengujian unit yang memeriksa perilaku aturan keamanan database Anda.

Pada prinsipnya, seluruh aplikasi Anda dapat dijalankan terhadap emulator lokal dan bukan database produksi, tetapi ada beberapa masalah yang mungkin akan Anda hadapi. Khususnya, adanya kerusakan integrasi dengan Firebase Auth. Kami sedang berusaha menyempurnakan hal ini. Untuk saat ini, sebaiknya Anda mencoba menulis beberapa pengujian guna memastikan bahwa aturan keamanan berfungsi seperti yang diharapkan.

Ketika emulator dijalankan, database Anda akan "terbuka" dari perspektif keamanan (semua pembacaan dan penulisan diperbolehkan). Anda dapat mengubah aturan keamanan dalam framework pengujian unit menggunakan modul SDK pengujian. Lihat penjelasan selengkapnya di bawah.

Seperti biasa, kami sangat mengharapkan masukan Anda. Jika punya masukan, langsung saja beri tahu kami.

Perbedaan antara emulator dan produksi

  1. Anda tidak harus membuat instance database secara eksplisit. Emulator akan otomatis membuat instance database yang diakses.
  2. Setiap database baru dimulai dengan aturan terbuka, sehingga setiap pengguna dapat melakukan pembacaan atau penulisan ke lokasi mana pun.
  3. Setiap database yang telah teremulasi menerapkan batas dan kuota paket Spark (terutama, hal ini membatasi setiap instance untuk 100 koneksi serentak).
  4. Setiap database akan menerima string "owner" sebagai token autentikasi admin.
    1. Jika Anda ingin menggunakan REST API sebagai admin, sertakan header
      Authorization: Bearer owner.
    2. Anda dapat menggunakan ini untuk menetapkan aturan menggunakan curl. Dengan asumsi aturan Anda berada dalam file database.rules.json, berikut ini seharusnya berfungsi:
      curl -X PUT -H 'Authorization: Bearer owner' --data @database.rules.json http://localhost:9000/.settings/rules.json?ns=<name>
  5. Emulator database tidak memiliki interaksi yang berfungsi dengan produk Firebase lainnya. Secara khusus, alur autentikasi Firebase normal tidak akan berfungsi. Sebagai gantinya, kami telah menyediakan metode initializeTestApp() dalam modul pengujian, yang menempati kolom auth. Pengendali Firebase yang dibuat menggunakan metode ini akan berperilaku seolah-olah telah berhasil diautentikasi sebagai entity apa pun yang Anda berikan. Jika Anda meneruskan null, pengendali tersebut akan berperilaku sebagai pengguna tak terautentikasi (misalnya, aturan auth != null akan gagal).

Menginstal emulator

Untuk menginstal emulator Realtime Database, gunakan Firebase CLI dan jalankan perintah di bawah:

firebase setup:emulators:database

Menjalankan emulator

Mulai emulator menggunakan perintah berikut. Emulator akan berjalan hingga Anda menghentikan prosesnya:

firebase emulators:start --only database

Perhatikan bahwa emulator Realtime Database memerlukan Java 8 atau lebih tinggi.

Dalam sebagian besar kasus, Anda ingin memulai emulator, menjalankan serangkaian pengujian, lalu menghentikan emulator setelah pengujian berjalan. Anda dapat melakukannya dengan mudah menggunakan perintah emulators:exec:

firebase emulators:exec --only database "./my-test-script.sh"

Ketika dimulai, emulator akan mencoba berjalan pada port default (9000). Anda dapat mengubah port emulator dengan memodifikasi bagian "emulators" pada file firebase.json Anda:

{
  // ...
  "emulators": {
    "database": {
      "port": "YOUR_PORT"
    }
  }
}

Berinteraksi dengan emulator

Instance Firebase Realtime Database normal dapat diakses di subdomain firebaseio.com, dan Anda dapat mengakses REST API seperti ini:

https://<database_name>.firebaseio.com/path/to/my/data.json

Emulator berjalan secara lokal, dan tersedia di localhost:9000. Untuk berinteraksi dengan instance database tertentu, Anda harus menggunakan parameter kueri untuk menentukan nama database.

http://localhost:9000/path/to/my/data.json?ns=<database_name>

Kami telah menyediakan modul @firebase/testing untuk mempermudah interaksi dengan emulator menggunakan Firebase SDK. Dengan modul @firebase/testing, Anda dapat berinteraksi dengan versi emulator Realtime Database yang berjalan secara lokal. Jika Anda mendapatkan error ECONNREFUSED atau waktu tunggu, periksa kembali apakah emulator sedang berjalan atau tidak.

Sebaiknya gunakan Node.js versi terbaru agar Anda dapat menggunakan notasi async/await. Hampir semua perilaku yang mungkin ingin Anda uji melibatkan fungsi asinkron, dan modul pengujian dirancang untuk digunakan dengan kode berbasis Promise.

Modul ini menampilkan metode berikut:

initializeTestApp({ databaseName: , auth: }) => FirebaseApp

Gunakan metode ini untuk membuat aplikasi yang diautentikasi sebagai pengguna khusus untuk digunakan pada pengujian.

Menampilkan aplikasi Firebase yang diinisialisasi sesuai dengan nama database dan penggantian variabel autentikasi yang ditentukan dalam pilihan. Harap diperhatikan bahwa ini TIDAK menggunakan databaseURL, karena tidak dijalankan terhadap server jarak jauh.

firebase.initializeTestApp({
  databaseName: "my-database",
  auth: { uid: "alice" }
});

initializeAdminApp({ databaseName: }) => FirebaseApp

Gunakan metode ini untuk membuat aplikasi yang diautentikasi sebagai admin guna menyiapkan status untuk pengujian.

Menampilkan aplikasi Firebase admin yang diinisialisasi sesuai dengan nama database yang ditentukan dalam pilihan. Aplikasi ini mengabaikan aturan keamanan saat melakukan pembacaan dan penulisan ke database.

firebase.initializeAdminApp({ databaseName: "my-database" });

loadDatabaseRules({ databaseName: , rules: }) => Promise

Gunakan metode ini untuk menetapkan aturan database Anda.

Mengirim aturan ke database yang berjalan secara lokal. Membawa objek pilihan yang menentukan "databaseName" dan "rules" Anda sebagai string.

firebase
      .loadDatabaseRules({
        databaseName: "my-database",
        rules: "{'rules': {'.read': false, '.write': false}}"
      });

apps() => [FirebaseApp]

Menampilkan semua pengujian dan aplikasi admin yang saat ini diinisialisasi.

Gunakan metode ini untuk menghapus data aplikasi di antara atau setelah pengujian (perhatikan bahwa aplikasi yang diinisialisasi dengan pemroses aktif membuat JavaScript tidak bisa keluar):

 Promise.all(firebase.apps().map(app => app.delete()))

assertFails(pr: Promise) => Promise

Menampilkan promise yang ditolak jika input berhasil, dan berhasil jika input ditolak.

Gunakan metode ini untuk menegaskan bahwa pembacaan atau penulisan database gagal:

firebase.assertFails(app.database().ref("secret").once("value"));

assertSucceeds(pr: Promise) => Promise

Menampilkan promise yang berhasil jika input berhasil, dan ditolak jika input ditolak.

Gunakan metode ini untuk menegaskan bahwa pembacaan atau penulisan database berhasil:

firebase.assertSucceeds(app.database().ref("public").once("value"));

Menghasilkan laporan pengujian

Setelah menjalankan serangkaian pengujian, Anda dapat mengakses laporan cakupan pengujian yang menunjukkan evaluasi dari setiap aturan keamanan Anda. Untuk mendapatkan laporan, buat kueri untuk endpoint yang terekspos pada emulator selagi endpoint ini berjalan. Untuk versi yang cocok dengan browser, gunakan URL berikut:

http://localhost:9000/.inspect/coverage?ns=<database_name>

URL ini memerinci aturan Anda ke dalam ekspresi dan subekspresi yang dapat Anda klik untuk mengetahui informasi lebih lanjut, termasuk jumlah eksekusi dan nilai yang ditampilkan. Untuk versi JSON mentah data ini, sertakan URL berikut dalam kueri Anda:

http://localhost:9000/.inspect/coverage.json?ns=<database_name>

Panduan Memulai

Jika Anda hanya ingin mendapatkan contoh minimal yang berfungsi, cobalah quickstart JavaScript.