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.