Catch up on everthing we announced at this year's Firebase Summit. Learn more

Gunakan ketentuan dalam Aturan Keamanan Penyimpanan Cloud Firebase

Panduan ini dibangun di atas mempelajari sintaks inti dari bahasa Aturan Firebase Keamanan panduan untuk menunjukkan cara menambahkan kondisi ke Aturan Firebase Keamanan Anda untuk Cloud Storage.

Blok bangunan utama dari Cloud Aturan Keamanan Penyimpanan adalah kondisi. Kondisi adalah ekspresi boolean yang menentukan apakah operasi tertentu harus diizinkan atau ditolak. Untuk aturan dasar, menggunakan true dan false literal kondisi bekerja prefectly dengan baik. Tetapi bahasa Aturan Keamanan Firebase untuk Cloud Storage memberi Anda cara untuk menulis kondisi yang lebih kompleks yang dapat:

  • Periksa otentikasi pengguna
  • Validasi data yang masuk

Autentikasi

Aturan Keamanan Firebase untuk Cloud Storage terintegrasi dengan Firebase Authentication untuk menyediakan autentikasi berbasis pengguna yang andal ke Cloud Storage. Hal ini memungkinkan kontrol akses granular berdasarkan klaim token Firebase Authentication.

Ketika dikonfirmasi Melakukan pengguna permintaan terhadap Cloud Storage, yang request.auth variabel dihuni dengan pengguna uid ( request.auth.uid ) serta klaim dari Firebase Authentication JWT ( request.auth.token ).

Selain itu, ketika menggunakan otentikasi kustom, klaim tambahan muncul di request.auth.token lapangan.

Ketika seorang pengguna yang tidak berkepentingan melakukan permintaan, yang request.auth variabel adalah null .

Dengan menggunakan data ini, ada beberapa cara umum untuk menggunakan otentikasi untuk mengamankan file:

  • Umum: mengabaikan request.auth
  • Dikonfirmasi pribadi: cek yang request.auth tidak null
  • Pengguna pribadi: cek yang request.auth.uid sama jalan uid
  • Pribadi grup: periksa klaim token khusus untuk mencocokkan klaim yang dipilih, atau baca metadata file untuk melihat apakah ada bidang metadata

Publik

Setiap aturan yang tidak mempertimbangkan request.auth konteks dapat dianggap sebagai public aturan, karena tidak mempertimbangkan konteks otentikasi pengguna. Aturan ini dapat berguna untuk menampilkan data publik seperti aset game, file suara, atau konten statis lainnya.

// Anyone to read a public image if the file is less than 100kB
// Anyone can upload a public file ending in '.txt'
match /public/{imageId} {
  allow read: if resource.size < 100 * 1024;
  allow write: if imageId.matches(".*\\.txt");
}

Pribadi yang diautentikasi

Dalam kasus tertentu, Anda mungkin ingin data dapat dilihat oleh semua pengguna aplikasi yang diautentikasi, tetapi tidak oleh pengguna yang tidak diautentikasi. Karena request.auth variabel null untuk semua pengguna yang tidak berkepentingan, yang harus Anda lakukan adalah memeriksa request.auth variabel ada dalam rangka untuk meminta otentikasi:

// Require authentication on all internal image reads
match /internal/{imageId} {
  allow read: if request.auth != null;
}

Pribadi pengguna

Sejauh ini kasus penggunaan yang paling umum untuk request.auth akan memberikan pengguna individu dengan hak akses granular pada file mereka: dari gambar profil upload membaca dokumen pribadi.

Karena file di Cloud Storage memiliki penuh "path" ke file, yang dibutuhkan untuk membuat sebuah file yang dikendalikan oleh pengguna adalah sepotong informasi yang unik, pengguna mengidentifikasi di awalan nama file (seperti pengguna uid ) yang dapat diperiksa ketika aturan dievaluasi:

// Only a user can upload their profile picture, but anyone can view it
match /users/{userId}/profilePicture.png {
  allow read;
  allow write: if request.auth.uid == userId;
}

Grup pribadi

Kasus penggunaan lain yang sama-sama umum adalah untuk mengizinkan izin grup pada suatu objek, seperti mengizinkan beberapa anggota tim untuk berkolaborasi pada dokumen bersama. Ada beberapa pendekatan untuk melakukan ini:

  • Mint Firebase Otentikasi kustom tanda yang berisi informasi tambahan tentang anggota kelompok (seperti ID kelompok)
  • Sertakan informasi kelompok (seperti ID kelompok atau daftar resmi uid s) dalam metadata file yang

Setelah data ini disimpan dalam token atau metadata file, data ini dapat dirujuk dari dalam aturan:

// Allow reads if the group ID in your token matches the file metadata's `owner` property
// Allow writes if the group ID is in the user's custom token
match /files/{groupId}/{fileName} {
  allow read: if resource.metadata.owner == request.auth.token.groupId;
  allow write: if request.auth.token.groupId == groupId;
}

Permintaan Evaluasi

Upload, download, perubahan metadata, dan menghapus dievaluasi menggunakan request dikirim ke Cloud Storage. Selain unik ID pengguna dan payload Firebase Authentication di request.auth objek seperti yang dijelaskan di atas, request variabel berisi path file di mana permintaan sedang dilakukan, waktu ketika permintaan diterima, dan baru resource nilai jika permintaan adalah menulis. Header HTTP dan status autentikasi juga disertakan.

The request objek juga mengandung pengguna ID unik dan payload Firebase Authentication di request.auth objek, yang akan dijelaskan lebih lanjut dalam User-Based Security bagian dari dokumentasi.

Daftar lengkap properti di request objek tersedia di bawah ini:

Properti Jenis Keterangan
auth peta<string, string> Ketika pengguna login, menyediakan uid , ID unik pengguna, dan token , peta klaim Firebase Otentikasi JWT. Jika tidak, itu akan menjadi null .
params peta<string, string> Peta yang berisi parameter kueri permintaan.
path jalur Sebuah path yang mewakili jalur permintaan sedang dilakukan di.
resource peta<string, string> Nilai sumber daya baru, hadir hanya pada write permintaan.
time stempel waktu Stempel waktu yang mewakili waktu server saat permintaan dievaluasi.

Evaluasi Sumber Daya

Saat mengevaluasi aturan, Anda mungkin juga ingin mengevaluasi metadata file yang diunggah, diunduh, dimodifikasi, atau dihapus. Ini memungkinkan Anda untuk membuat aturan yang kompleks dan kuat yang melakukan hal-hal seperti hanya mengizinkan file dengan tipe konten tertentu untuk diunggah, atau hanya file yang lebih besar dari ukuran tertentu yang akan dihapus.

Firebase Aturan Keamanan untuk Cloud Storage menyediakan file metadata dalam resource objek, yang berisi pasangan nilai / kunci dari metadata muncul dalam sebuah objek Cloud Storage. Sifat-sifat ini dapat diperiksa pada read atau write permintaan untuk memastikan integritas data.

Pada write permintaan (seperti upload, update metadata, dan menghapus), selain resource objek, yang berisi metadata file untuk file yang saat ini ada di jalur permintaan, Anda juga memiliki kemampuan untuk menggunakan request.resource objek, yang berisi subset dari metadata file yang akan ditulis jika penulisan diizinkan. Anda dapat menggunakan dua nilai ini untuk memastikan integritas data atau menerapkan batasan aplikasi seperti jenis atau ukuran file.

Daftar lengkap properti di resource objek yang tersedia di bawah ini:

Properti Jenis Keterangan
name rangkaian Nama lengkap objek
bucket rangkaian Nama ember tempat objek ini berada.
generation ke dalam The Google Cloud Storage objek generasi obyek ini.
metageneration ke dalam The Google Cloud Storage objek metageneration obyek ini.
size ke dalam Ukuran objek dalam byte.
timeCreated stempel waktu Stempel waktu yang menunjukkan waktu suatu objek dibuat.
updated stempel waktu Stempel waktu yang menunjukkan waktu terakhir objek diperbarui.
md5Hash rangkaian Sebuah MD5 hash dari objek.
crc32c rangkaian Sebuah hash crc32c dari objek.
etag rangkaian Etag yang terkait dengan objek ini.
contentDisposition rangkaian Disposisi konten yang terkait dengan objek ini.
contentEncoding rangkaian Encoding konten yang terkait dengan objek ini.
contentLanguage rangkaian Bahasa konten yang terkait dengan objek ini.
contentType rangkaian Jenis konten yang terkait dengan objek ini.
metadata peta<string, string> Pasangan kunci/nilai metadata khusus tambahan yang ditentukan pengembang.

request.resource berisi semua ini dengan pengecualian generation , metageneration , etag , timeCreated , dan updated .

Validasi data

Firebase Aturan Keamanan untuk Cloud Storage juga dapat digunakan untuk validasi data, termasuk memvalidasi nama file dan path serta file properti metadata seperti contentType dan size .

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      // Only allow uploads of any image file that's less than 5MB
      allow write: if request.resource.size < 5 * 1024 * 1024
                   && request.resource.contentType.matches('image/.*');
    }
  }
}

Fungsi kustom

Saat Aturan Keamanan Firebase menjadi lebih kompleks, Anda mungkin ingin menggabungkan kumpulan kondisi dalam fungsi yang dapat digunakan kembali di seluruh kumpulan aturan. Aturan keamanan mendukung fungsi kustom. Sintaks untuk fungsi khusus agak mirip JavaScript, tetapi fungsi Aturan Keamanan Firebase ditulis dalam bahasa khusus domain yang memiliki beberapa batasan penting:

  • Fungsi hanya dapat berisi satu return pernyataan. Mereka tidak dapat berisi logika tambahan. Misalnya, mereka tidak dapat menjalankan loop atau memanggil layanan eksternal.
  • Fungsi dapat secara otomatis mengakses fungsi dan variabel dari lingkup di mana mereka didefinisikan. Sebagai contoh, sebuah fungsi yang didefinisikan dalam service firebase.storage lingkup memiliki akses ke resource variabel, dan untuk Cloud Firestore saja, built-in fungsi seperti get() dan exists() .
  • Fungsi dapat memanggil fungsi lain tetapi mungkin tidak berulang. Total kedalaman tumpukan panggilan dibatasi hingga 10.
  • Dalam versi rules2 , fungsi dapat mendefinisikan variabel menggunakan let kata kunci. Fungsi dapat memiliki sejumlah let binding, tetapi harus diakhiri dengan pernyataan return.

Sebuah fungsi didefinisikan dengan function kata kunci dan mengambil nol atau lebih argumen. Misalnya, Anda mungkin ingin menggabungkan dua jenis kondisi yang digunakan dalam contoh di atas menjadi satu fungsi:

service firebase.storage {
  match /b/{bucket}/o {
    // True if the user is signed in or the requested data is 'public'
    function signedInOrPublic() {
      return request.auth.uid != null || resource.data.visibility == 'public';
    }
    match /images/{imageId} {
      allow read, write: if signedInOrPublic();
    }
    match /mp3s/{mp3Ids} {
      allow read: if signedInOrPublic();
    }
  }
}

Menggunakan fungsi dalam Aturan Keamanan Firebase membuatnya lebih mudah dipelihara seiring dengan bertambahnya kompleksitas aturan Anda.

Langkah selanjutnya

Setelah diskusi tentang kondisi ini, Anda memiliki pemahaman Aturan yang lebih canggih dan siap untuk:

Pelajari cara menangani kasus penggunaan inti, dan pelajari alur kerja untuk mengembangkan, menguji, dan menerapkan Aturan: