Cara menggunakan Security Rules Library pada project anda untuk alur data yang lebih aman

Surahutomo Aziz Pradana
Firebase Indonesia
Published in
8 min readFeb 19, 2023

Halo Firebase Dev!

Seperti yang mungkin kita ketahui bahwa sebagian besar orang menggunakan fitur Firebase tanpa melakukan testing lagi karena :

  • Jelas bahwa firebase adalah
    cukup stabil dan tidak memerlukan testing apa pun
  • Kita bisa melakukan mocking seluruh library dan memberikan hasil nilai yang telah ditentukan yang dikembalikan dari library firebase dengan asumsi bahwa firebase berfungsi dengan baik. Bahkan terkadang firebase juga memiliki respons fungsi yang berbeda yang mungkin akan berubah pada versi berikutnya suatu hari nanti, yang membuat kita harus memperbaikinya secara manual untuk semua tiruan yang kita miliki di project kita atau bahkan kasus terburuk kita bahkan tidak menyadarinya.

Sekarang, sebelum kita melangkah lebih jauh, mari kita bicara tentang testing terlebih dahulu.

Jenis testing

Seperti yang mungkin kita ketahui ada banyak jenis testing, seperti:

  • Unit Testing
  • Rendering Testing
  • Integraton Testing
  • Automation Testing
  • Performance Testing
  • dll.

Sangat penting untuk mengetahui jenis Testing apa yang harus kita terapkan pada project kita dan kasus penggunaannya, tetapi saya akan membicarakannya nanti di artikel lain. jadi untuk saat ini mari fokus pada bagaimana kita harus mengimplementasikan Testing untuk project Firebase kita.

Menyiapkan Mindset kita

Seperti yang mungkin kita ketahui, Firebase adalah kerangka kerja kita yang kita gunakan dalam project Firebase kita, yang telah diimplementasikan oleh tim Firebase sendiri untuk melindungi stabilitas produk mereka, yang berarti kita tidak perlu melakukan testing lagi di pihak kita dan Memastikan bagaimana API Firebase fungsi harus memiliki respons tertentu yang kita tentukan. tetapi sebagai gantinya kita harus melakukan testing tentang bagaimana fungsi Firebase API seharusnya berperilaku.

Nah, dengan 2 pola pikir ini kita akan memiliki pendekatan Testing yang berbeda.

  • Bagaimana fungsi API Firebase harus memiliki respons tertentu dalam hal ini kita harus menggunakan Testing Unit
  • Bagaimana seharusnya fungsi API Firebase Dalam hal ini kita harus menggunakan Testing Integrasi

Jadi dalam hal ini, kita harus mengambil opsi ke-2 karena untuk opsi ke-1, Tim Firebase sudah melakukan itu, karena kita sebagai pengguna Firebase hanya perlu memperhatikan bagaimana perilaku produk yang kita gunakan. terutama karena struktur fungsi Firebase API mereka dapat berubah dari waktu ke waktu, dan hal yang harus kita lakukan untuk mengoptimalkan dan menyesuaikannya adalah dengan mengikuti alur firebase sebagaimana mestinya, bukan detail dari struktur data fungsi yang didapat dari Firebase API.

Sekarang kita sudah mendapatkan pola pikir Testing, Selanjutnya kita akan memahami tentang Security Rules, mari kita mulai!

Security Rules

Security Rules adalah seperangkat aturan yang dapat Anda terapkan dalam project Anda yang menggunakan Firebase, aturan ini sangat kuat karena kita membuat lapisan keamanan baru yang memvalidasi dan melindungi operasi apa pun berdasarkan konteks dan perilaku data kita, Anda dapat menggunakan Security Rules untuk mengamankan Firebase yang telah diimplementasikan dalam project Anda

Di Firebase, ada 3 fitur Firebase yang bisa Anda amankan dengan Security Rules :

  • Realtime Database
  • Firestore
  • Cloud Storage

Masing-masing memiliki metrik keamanan berbeda yang dapat Anda amankan, dalam tulisan ini, saya akan mendemonstrasikan kasus penggunaan untuk Cloud Firestore, tetapi kita hanya akan fokus pada bagaimana kita dapat melakukan testing menggunakan Security Rules Library

Security Rules Library

Pertama Anda dapat memeriksa librarynya di sini https://www.npmjs.com/package/@firebase/rules-unit-testing

dengan library ini Anda dapat menggunakannya untuk memvalidasi dan Memastikan sistem Security Rules Anda, menggunakan fungsi yang diimpor seperti:

initializeTestEnvironment(), assertSucceeds(), assertFails()

Sekarang kita sudah mendapatkan dasar dan pemahamannya, mari berlatih!

Practice

Jika Anda ingin melihat kode lengkapnya, silakan lihat repo github ini! https://github.com/retzd-tech/firebase-unit-testing

Persiapan

Dependancies

  • Firebase : Tentunya dengan asumsi kita menggunakan fitur Firebase
  • @firebase/rules-unit-testing : Library untuk menguji Security Rules Firebase kita
  • mocha : Kerangka Testing kita yang akan mengeksekusi Library Testing

Folder ini digunakan untuk menyimpan data awal untuk tujuan Testing kita yang sudah saya siapkan dengan mengekspor data di Cloud Firestore lokal dari Firebase Emulator Suite.

Konfigurasi Firebase

Dalam demonstrasi ini, kita hanya perlu menyiapkan Cloud Firestore dan Emulator, Tapi mengapa kita membutuhkan Emulator?

Jika Anda belum pernah mendengarnya, Firebase juga memiliki Emulator yang disebut Firebase Emulator Suite untuk menjalankan dan mengemulasi fitur Firebase kita secara lokal agar kita dapat mengembangkan, menguji debug dengan lebih mudah.

library Security Rules ini menggunakan Emulator sebagai orkestratornya, pada dasarnya library akan menjalankan firebase menggunakan emulator dan akan memvalidasi semuanya berdasarkan apa yang telah kita definisikan dalam kasus Testing kita, artinya kita harus memiliki emulator yang berjalan untuk menjalankan Unit testing.

Untuk menjalankan Firebase Emulator Suite Anda dapat menjalankan perintah ini

emulator firebase: mulai — import=./unit-test-data

Ini akan menjalankan emulator seperti yang ditunjukkan di bawah ini!

Lalu Anda akan melihat data telah diimpor selama emulator dimulai untuk membuat test case kita berfungsi!

Cloud Firestore Rules

Berikut adalah Security Rules kita yang akan kita gunakan, Security Rules ini akan mevalidasi :

- anggota hanya dapat membaca data anggotanya sendiri.
- admin adalah satu-satunya yang dapat melakukan penulisan database dan admin harus melewati kolom email.
- admin harus terdaftar dalam daftar hak istimewa dokumen admin untuk dapat melakukan data untuk memastikan admin adalah admin yang valid.

Membuat Unit Testing!

  • Import library yang diperlukan

Di sini kita akan melakukan import 2 library ini :
- firebase/firestore : library untuk mengoperasikan operasi firestore
- @firebase/rules-unit-testing : library untuk menguji security rules Firebase kita

Kemudian, kita harus menginisiasi ID Project Firebase kita dan membuat fungsi untuk mendapatkan instance Firebase, karena kita memerlukan ini untuk melakukan beberapa operasi firestore firebase.

Anda juga dapat membuat fungsi untuk mendapatkan instance firestore dalam beberapa unit testing!

Untuk demonstrasi, kita akan menggunakan skema di mana admin dapat mengontrol anggota, dan anggota dapat mengontrol akunnya tetapi bukan anggota lainnya.

Test Case — Anggota

  • Test Case 1 : seharusnya dapat melihat data profil anggota

Apa yang kita lakukan pada unit testing:
- Setel autentikasi ke tidak diautentikasi (publik)
- Dapatkan referensi dokumen Firestore di “members/userId”
- Tegaskan jika kita berhasil mendapatkan dokumen dari firestore

  • Test Case 2 : seharusnya tidak dapat menulis data anggota

Apa yang kita lakukan pada unit testing:
- Setel autentikasi ke tidak diautentikasi (publik)
- Setel referensi dokumen Firestore di “members/userId”
- Tegaskan jika kita tidak dapat menyetel dokumen di firestore

  • Test Case 3 : harus dapat menulis data jika pengguna diautentikasi

Apa yang kita lakukan pada unit testing:
- Setel autentikasi untuk diautentikasi dengan User ID ke “adminId”
- Setel payload email dokumen ke “members/userId” — Setel referensi dokumen Firestore di “members/userId” dengan payload email
- Tegaskan jika kita bisa atur dokumen di firestore dengan id pengguna yang diautentikasi

  • Test Case 4 : seharusnya tidak dapat menulis data jika pengguna tidak diautentikasi

Apa yang kita lakukan pada unit testing:
- Setel autentikasi ke tidak diautentikasi (publik)
- Setel payload nama dokumen ke “members/userId”
- Setel referensi dokumen Firestore di “members/userId” dengan payload nama
- Tegaskan jika kita tidak dapat menyetel dokumen di firestore dengan id pengguna yang tidak diautentikasi (publik)

  • Test Case 5 & 6 : seharusnya dapat membaca dokumen dengan id pengguna yang benar / id pengguna yang salah

Apa yang kita lakukan pada unit testing:
- Atur autentikasi untuk diautentikasi dengan User ID ke “userId” / “wrongUserId”
- Atur referensi dokumen Firestore di “members/userId”
- Penegasan berhasil jika kita mendapatkan referensi dokumen dengan “userId”, jika tidak assert gagal jika kita mendapatkan referensi dokumen dengan “wrongUserId“, ini berarti hanya “userId“ yang dapat mengakses dokumen firestore “userId“, dan “wrongUserId“ tidak dapat mengaksesnya karena memiliki ID pengguna yang berbeda , cukup mengagumkan bukan? 😄

Test Case — Admin

  • Test Case 7 & 8 : seharusnya bisa menulis atau memperbarui anggota jika perannya adalah admin / bukan admin

Apa yang kita lakukan pada unit testing:
- Setel autentikasi untuk diautentikasi dengan ID Pengguna ke “adminId” / “memberId ( di mana anggota tidak dapat memiliki akses )”
- Setel payload email dokumen ke “members/memberId”, bahkan yang ke-2 test case tanpa payload, itu masih valid, namun dengan atau tanpa payload, jika operasi ditolak, itu tidak akan mempengaruhi apa-apa, perbedaan ini juga untuk demonstrasi menjelaskan apa yang terjadi.
- Penegasan berhasil jika ID pengguna adalah “adminId” untuk dapat mengatur data dalam dokumen “members/memberId”, jika tidak, penegasan gagal jika ID pengguna bukan admin, seperti “memberId” dalam unit testing ke-2.

  • Test Case 9 & 10 : seharusnya tidak dapat menulis dokumen anggota jika tidak ada bidang email yang disediakan / dengan bidang email yang disediakan

Apa yang kita lakukan pada test case :
- Atur otentikasi untuk diautentikasi dengan ID Pengguna ke “adminId” untuk keduanya, berarti keduanya memiliki akses yang tepat.
- Atur payload dokumen ke kosong / set payload ke email payload untuk “members/memberId”,
- Menegaskan gagal jika payload tidak berisi objek email yang disediakan / memastikan berhasil jika payload berisi objek email yang disediakan , jadi keduanya adalah admin pengguna, kita juga dapat meningkatkan keamanan kita dengan memvalidasi melalui field lainnyajuga, yang sangat berguna!

Dan terakhir, mari kita jalankan perintah tes ini untuk melihat hasil tes kita! pastikan Anda masih memiliki emulator yang berjalan pada langkah sebelumnya!

npm run test

Baiklah, semua test case passed!
Jadi untuk sekarang itu aja ya!

Ada banyak cara lain untuk menggunakan security rules dan library testingnya untuk memperkuat operasi firebase kita di dalam project atau produk kita, silakan lihat dokumentasinya di sini https://firebase.google.com/docs/rules .

Singkatnya , apa yang telah kita pelajari sejauh ini adalah:
— kita mempelajari jenis testing
— Membangun pola pikir testing yang tepat
— kita mempelajari security rules dan cara menggunakannya
— kita mempelajari library untuk menguji security rules kita
— kita berlatih untuk menguji berbagai skenario untuk menguji security rules kita

Semoga bermanfaat dan sampai jumpa di pembahasan selanjutnya!

--

--

Surahutomo Aziz Pradana
Firebase Indonesia

Google Developer Expert - Firebase, Co-Lead GDG Jakarta, GDSC Lead PENS, Engineering Manager, AR/VR Tech Lead, Fullstack Engineer