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 berikut:

Kolom Deskripsi
email Alamat email yang terhubung dengan akun, jika ada.
email_verified true jika pengguna telah memverifikasi bahwa 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 tersebut bersifat unik di dalam sebuah project.
firebase.identities Kamus dari semua identitas yang terkait ke akun pengguna ini. Kunci kamus dapat berupa salah satu dari berikut: 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 biasanya yang mendapatkan token ini. Dapat berupa salah satu dari 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 kustom yang Anda tentukan.

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

Untuk informasi lebih lanjut 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 pemohon — 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.uid == userId;
      allow create: if request.auth.uid != 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.uid == userId;
  }
}

Menentukan informasi pengguna khusus

Anda dapat ;lebih jauh memanfaatkan variabel auth guna menentukan bidang 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 get(/databases/(database)/documents/users/$(request.auth.uid)).data.admin) == true;
    read: if request.auth.uid != null;
  }
}

Untuk Aturan pada Realtime Database dan Storage, buat klaim khusus di Autentikasi. Kemudian, Anda dapat mereferensi 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 .