Aturan Keamanan dan Autentikasi Firebase

Aturan Keamanan Firebase menyediakan kontrol akses dan validasi data dalam format yang mendukung berbagai tingkat kompleksitas. Untuk membangun sistem akses berbasis pengguna dan peran yang memastikan keamanan data pengguna Anda, gunakan Firebase Authentication dengan Firebase Security Rules.

Identifikasi pengguna

Autentikasi mengidentifikasi pengguna yang meminta akses ke data Anda dan memberikan informasi tersebut sebagai variabel yang dapat Anda manfaatkan pada aturan Anda. Variabel auth berisi informasi berikut:

  • uid: ID pengguna unik yang ditetapkan untuk pengguna yang meminta.
  • token: Peta nilai yang dikumpulkan oleh Autentikasi.

Variabel auth.token berisi nilai-nilai berikut:

Kolom Deskripsi
email Alamat email yang terhubung dengan akun, jika ada.
email_verified true jika pengguna telah memverifikasi bahwa mereka memiliki akses ke alamat email. Beberapa penyedia secara otomatis memverifikasi alamat email yang mereka miliki.
phone_number Nomor telepon yang terkait dengan akun, jika ada.
name Nama tampilan pengguna, jika ditetapkan.
sub UID Firebase pengguna. UID ini bersifat unik dalam sebuah project.
firebase.identities Kamus yang memuat semua identitas terkait akun pengguna ini. Kunci kamus dapat berupa salah satu dari berikut ini: email, phone, google.com, facebook.com, github.com, twitter.com. Nilai kamus adalah array pengidentifikasi unik untuk setiap penyedia identitas yang terkait dengan akun. Misalnya, auth.token.firebase.identities["google.com"][0] berisi ID pengguna Google pertama yang dikaitkan dengan akun.
firebase.sign_in_provider Penyedia login yang digunakan untuk mendapatkan token ini. Dapat berupa salah satu string berikut: custom, password, phone, anonymous, google.com, facebook.com, github.com, twitter.com.

Jika Anda ingin menambahkan atribut autentikasi yang disesuaikan, variabel auth.token juga berisi segala klaim khusus yang Anda tentukan.

Ketika pengguna yang meminta akses tidak sedang login, variabel auth adalah null. Anda dapat memanfaatkan hal ini pada aturan jika, misalnya, Anda ingin membatasi akses baca untuk pengguna yang diautentikasi - auth != null. Namun, kami biasanya menyarankan untuk membatasi akses tulis lebih lanjut.

Untuk mengetahui informasi selengkapnya tentang variabel auth, lihat dokumentasi referensi untuk Cloud Firestore, Realtime Database, dan Storage.

Memanfaatkan informasi pengguna pada aturan

Dalam praktiknya, menggunakan informasi yang diautentikasi pada aturan Anda membuat aturan Anda lebih kuat dan fleksibel. Anda dapat mengontrol akses ke data berdasarkan identitas pengguna.

Pada aturan Anda, tentukan bagaimana informasi dalam variabel auth — informasi pengguna dari peminta — dapat cocok dengan informasi pengguna yang terkait dengan data yang diminta.

Misalnya, aplikasi Anda mungkin ingin memastikan pengguna hanya dapat membaca dan menulis data mereka sendiri. Dalam skenario ini, Anda ingin kecocokan antara variabel auth.uid dan ID pengguna pada data yang diminta:

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Make sure the uid of the requesting user matches name of the user
    // document. The wildcard expression {userId} makes the userId variable
    // available in rules.
    match /users/{userId} {
      allow read, update, delete: if request.auth != null && request.auth.uid == userId;
      allow create: if request.auth != null;
    }
  }
}

Realtime Database

{
  "rules": {
    "users": {
      "$userId": {
        // grants write access to the owner of this user account
        // whose uid must exactly match the key ($userId)
        ".write": "$userId === auth.uid"
      }
    }
  }
}

Storage

service firebase.storage {
  // Only a user can upload their file, but anyone can view it
  match /users/{userId}/{fileName} {
    allow read;
    allow write: if request.auth != null && request.auth.uid == userId;
  }
}

Menentukan informasi pengguna khusus

Anda dapat memanfaatkan variabel auth lebih lanjut untuk menentukan kolom khusus yang ditetapkan untuk pengguna aplikasi Anda.

Misalnya, anggap Anda ingin membuat peran "admin" yang memungkinkan akses tulis di jalur tertentu. Anda akan menetapkan atribut itu untuk pengguna, kemudian memanfaatkannya pada aturan yang memberikan akses di jalur.

Di Cloud Firestore, Anda dapat menambahkan bidang khusus ke dokumen pengguna dan mengambil nilai bidang itu dengan bacaan tersemat pada aturan Anda. Jadi, aturan berbasis admin Anda akan terlihat seperti contoh berikut:

Cloud Firestore

service cloud.firestore {
  match "some_collection/": {
    // Remember that, in Cloud Firestore, reads embedded in your rules are billed operations
    write: if request.auth != null && get(/databases/(database)/documents/users/$(request.auth.uid)).data.admin) == true;
    read: if request.auth != null;
  }
}

Untuk Aturan pada Realtime Database dan Storage, buat klaim khusus di Autentikasi. Selanjutnya, Anda dapat mereferensikan klaim khusus tersebut menggunakan variabel auth.token.

Realtime Database

{
  "rules": {
    "some_path/$sub_path": {
      // Create a custom claim for the admin role
      ".write": "auth.uid != null && auth.token.writer == true"
      ".read": "auth.uid != null"
      }
    }
  }

Storage

service firebase.storage {
  // Create a custom claim for the admin role
  match /files/{fileName} {
    allow read: if request.auth.uid != null;
    allow write: if request.auth.token.admin == true;
  }
}

Untuk melihat contoh Aturan dasar lainnya yang memanfaatkan Autentikasi, lihat Aturan Keamanan Dasar .