Aturan Keamanan dan Firebase Authentication

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

Mengidentifikasi pengguna

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

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

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 ID 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.
firebase.tenant tenantId yang terkait dengan akun, jika ada. misalnya, tenant2-m6tyz

Jika Anda ingin menambahkan atribut autentikasi yang disesuaikan, variabel auth.token juga berisi segala klaim kustom 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 jauh.

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

Memanfaatkan informasi pengguna pada aturan

Dalam praktiknya, menggunakan informasi yang diautentikasi pada aturan Anda membuat aturan Anda lebih bermanfaat 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, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

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"
      }
    }
  }
}

Cloud 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 tersebut kepada pengguna, kemudian memanfaatkannya pada aturan yang memberikan akses ke jalur tersebut.

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

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents/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;
  }
}

Anda dapat mengakses klaim kustom pada Aturan setelah membuat klaim kustom di Authentication. Selanjutnya, Anda dapat mereferensikan klaim kustom tersebut menggunakan variabel auth.token.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, check for an admin claim
    allow write: if request.auth.token.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if request.auth.token.reader == "true";
     allow write: if request.auth.token.writer == "true";
   }
  }
}

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"
      }
    }
  }

Cloud 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 Authentication, lihat Aturan Keamanan Dasar.