Aturan Keamanan Firebase menyediakan kontrol akses dan validasi data dalam format yang mendukung berbagai tingkat kerumitan. Untuk membangun sistem akses berbasis pengguna dan berbasis peran yang menjaga keamanan data pengguna Anda, gunakan Firebase Authentication dengan Aturan Keamanan Firebase.
Identifikasi pengguna
Autentikasi mengidentifikasi pengguna yang meminta akses ke data Anda dan memberikan informasi tersebut sebagai variabel yang dapat Anda manfaatkan dalam aturan Anda. Variabel auth
berisi informasi berikut:
-
uid
: ID pengguna unik, yang ditetapkan untuk pengguna yang meminta. -
token
: Peta nilai yang dikumpulkan oleh Otentikasi.
Variabel auth.token
berisi nilai berikut:
Bidang | Keterangan |
---|---|
email | Alamat email yang terkait 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 disetel. |
sub | UID Firebase pengguna. Ini unik dalam sebuah proyek. |
firebase.identities | Kamus semua identitas yang terkait dengan akun pengguna ini. Kunci kamus dapat berupa salah satu dari yang berikut: email , phone , google.com , facebook.com , github.com , twitter.com . Nilai kamus adalah larik 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 tersebut. |
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 klaim khusus yang Anda tentukan.
Saat pengguna yang meminta akses tidak masuk, variabel auth
adalah null
. Anda dapat memanfaatkan ini dalam aturan Anda jika, misalnya, Anda ingin membatasi akses baca ke pengguna yang diautentikasi — auth != null
. Namun, kami umumnya menyarankan untuk membatasi akses tulis lebih lanjut.
Untuk informasi lebih lanjut tentang variabel auth
, lihat dokumentasi referensi untuk Cloud Firestore , Realtime Database , dan Cloud Storage .
Manfaatkan informasi pengguna dalam aturan
Dalam praktiknya, menggunakan informasi yang diautentikasi dalam aturan membuat aturan Anda lebih kuat dan fleksibel. Anda dapat mengontrol akses ke data berdasarkan identitas pengguna.
Dalam 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 bahwa pengguna hanya dapat membaca dan menulis datanya sendiri. Dalam skenario ini, Anda menginginkan kecocokan antara variabel auth.uid
dan ID pengguna pada data yang diminta:
Toko Api Awan
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;
}
}
}
Basis Data Waktu Nyata
{
"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"
}
}
}
}
Penyimpanan awan
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;
}
}
Tentukan informasi pengguna khusus
Anda selanjutnya dapat memanfaatkan variabel auth
untuk menentukan bidang khusus yang ditetapkan ke pengguna aplikasi Anda.
Misalnya, asumsikan Anda ingin membuat peran "admin" yang mengaktifkan akses tulis di jalur tertentu. Anda akan menetapkan atribut itu ke pengguna, lalu memanfaatkannya dalam aturan yang memberikan akses pada jalur.
Di Cloud Firestore, Anda dapat menambahkan kolom kustom ke dokumen pengguna dan mengambil nilai kolom tersebut dengan pembacaan tersemat di aturan Anda. Jadi, aturan berbasis admin Anda akan terlihat seperti contoh berikut:
Toko Api Awan
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 khusus di Aturan setelah membuat klaim khusus di Autentikasi. Anda kemudian dapat mereferensikan klaim khusus tersebut menggunakan variabel auth.token
.
Toko Api Awan
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";
}
}
}
Basis Data Waktu Nyata
{
"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"
}
}
}
Penyimpanan awan
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 lebih banyak contoh Aturan dasar yang memanfaatkan Otentikasi, lihat Aturan Keamanan Dasar .