Firebase Cloud Storage Güvenlik Kurallarındaki kullanım koşulları

Bu kılavuz, Bulut Depolama için Firebase Güvenlik Kurallarınıza nasıl koşul ekleyeceğinizi göstermek üzere Firebase Güvenlik Kuralları dil kılavuzunun temel sözdizimini öğrenmeyi temel alır.

Bulut Depolama Güvenlik Kurallarının birincil yapı taşı koşuldur . Koşul, belirli bir işleme izin verilmesi veya reddedilmesi gerektiğini belirleyen bir boole ifadesidir. Temel kurallar için, true ve false değerlerin koşul olarak kullanılması gayet iyi sonuç verir. Ancak Cloud Storage için Firebase Güvenlik Kuralları dili size aşağıdakileri yapabilecek daha karmaşık koşullar yazmanın yollarını sunar:

  • Kullanıcı kimlik doğrulamasını kontrol edin
  • Gelen verileri doğrula

Kimlik doğrulama

Cloud Storage için Firebase Güvenlik Kuralları, Firebase Authentication ile entegre olarak Cloud Storage'a güçlü kullanıcı tabanlı kimlik doğrulama sağlar. Bu, Firebase Authentication jetonunun taleplerine dayalı olarak ayrıntılı erişim kontrolüne olanak tanır.

Kimliği doğrulanmış bir kullanıcı Cloud Storage'a karşı bir istek gerçekleştirdiğinde request.auth değişkeni, kullanıcının kullanıcı uid ( request.auth.uid ) yanı sıra Firebase Kimlik Doğrulama JWT'nin ( request.auth.token ) talepleriyle doldurulur.

Ayrıca, özel kimlik doğrulama kullanıldığında request.auth.token alanında ek talepler ortaya çıkar.

Kimliği doğrulanmamış bir kullanıcı bir istek gerçekleştirdiğinde request.auth değişkeni null olur.

Bu verileri kullanarak, dosyaların güvenliğini sağlamak için kimlik doğrulamayı kullanmanın birkaç yaygın yolu vardır:

  • Herkese açık: request.auth yoksay
  • Kimliği doğrulanmış özel: request.auth null olup olmadığını kontrol edin
  • Kullanıcı özel: request.auth.uid bir yol uid kimliğine eşit olup olmadığını kontrol edin
  • Grup özel: seçilen bir taleple eşleşecek şekilde özel belirtecin taleplerini kontrol edin veya bir meta veri alanının mevcut olup olmadığını görmek için dosya meta verilerini okuyun

Halk

request.auth bağlamını dikkate almayan herhangi bir kural, kullanıcının kimlik doğrulama bağlamını dikkate almadığından public kural olarak kabul edilebilir. Bu kurallar, oyun varlıkları, ses dosyaları veya diğer statik içerikler gibi genel verilerin ortaya çıkarılmasında yararlı olabilir.

// 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");
}

Kimliği doğrulanmış özel

Bazı durumlarda, verilerin uygulamanızın kimliği doğrulanmış tüm kullanıcıları tarafından görüntülenebilmesini, ancak kimliği doğrulanmamış kullanıcılar tarafından görüntülenememesini isteyebilirsiniz. request.auth değişkeni kimliği doğrulanmamış tüm kullanıcılar için null olduğundan, kimlik doğrulama gerektirmek için yapmanız gereken tek şey request.auth değişkeninin var olup olmadığını kontrol etmektir:

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

Kullanıcı özel

request.auth bugüne kadarki en yaygın kullanım durumu, bireysel kullanıcılara dosyaları üzerinde ayrıntılı izinler sağlamak olacaktır: profil resimleri yüklemekten özel belgeleri okumaya kadar.

Cloud Storage'daki dosyaların dosyaya giden tam bir "yolu" olduğundan, bir dosyanın kullanıcı tarafından kontrol edilmesi için tek gereken, dosya adı önekinde (kullanıcının kullanıcı uid gibi) kontrol edilebilecek benzersiz, kullanıcıyı tanımlayan bir bilgi parçasıdır. kural değerlendirildiğinde:

// 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 özel

Aynı derecede yaygın olan bir başka kullanım durumu da, birkaç ekip üyesinin paylaşılan bir belge üzerinde işbirliği yapmasına izin vermek gibi bir nesne üzerinde grup izinlerine izin vermek olacaktır. Bunu yapmanın birkaç yaklaşımı vardır:

  • Bir grup üyesi hakkında ek bilgiler (grup kimliği gibi) içeren bir Firebase Authentication özel jetonu oluşturun
  • Dosya meta verilerine grup bilgilerini (grup kimliği veya yetkili uid listesi gibi) ekleyin

Bu veriler belirteçte veya dosya meta verilerinde depolandıktan sonra, bu verilere bir kural içinden başvurulabilir:

// 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;
}

Değerlendirme İste

Yüklemeler, indirmeler, meta veri değişiklikleri ve silme işlemleri, Cloud Storage'a gönderilen request kullanılarak değerlendirilir. Yukarıda açıklandığı gibi request.auth nesnesindeki kullanıcının benzersiz kimliğine ve Firebase Authentication verisine ek olarak request değişkeni, isteğin gerçekleştirildiği dosya yolunu, isteğin alındığı zamanı ve gerekiyorsa yeni resource değerini içerir. istek bir yazmadır.

request nesnesi aynı zamanda request.auth nesnesinde kullanıcının benzersiz kimliğini ve Firebase Kimlik Doğrulama yükünü de içerir; bu, belgelerin Kullanıcı Tabanlı Güvenlik bölümünde daha ayrıntılı olarak açıklanacaktır.

request nesnesindeki özelliklerin tam listesi aşağıda mevcuttur:

Mülk Tip Tanım
auth harita<dize, dize> Bir kullanıcı oturum açtığında, uid , kullanıcının benzersiz kimliği ve token Firebase Authentication JWT iddialarının bir haritasını sağlar. Aksi halde null olacaktır.
params harita<dize, dize> İsteğin sorgu parametrelerini içeren harita.
path yol İsteğin gerçekleştirildiği yolu temsil eden path .
resource harita<dize, dize> Yalnızca write isteklerinde mevcut olan yeni kaynak değeri.
time zaman damgası İsteğin değerlendirildiği sunucu zamanını temsil eden zaman damgası.

Kaynak Değerlendirmesi

Kuralları değerlendirirken karşıya yüklenen, indirilen, değiştirilen veya silinen dosyanın meta verilerini de değerlendirmek isteyebilirsiniz. Bu, yalnızca belirli içerik türlerine sahip dosyaların yüklenmesine izin vermek veya yalnızca belirli bir boyuttan büyük dosyaların silinmesine izin vermek gibi işlemleri yapan karmaşık ve güçlü kurallar oluşturmanıza olanak tanır.

Cloud Storage için Firebase Güvenlik Kuralları, bir Cloud Storage nesnesinde ortaya çıkan meta verilerin anahtar/değer çiftlerini içeren resource nesnesinde dosya meta verileri sağlar. Bu özellikler, veri bütünlüğünü sağlamak için read veya write istekleri üzerine incelenebilir.

write isteklerinde (yüklemeler, meta veri güncellemeleri ve silmeler gibi), istek yolunda o anda mevcut olan dosyanın dosya meta verilerini içeren resource nesnesine ek olarak request.resource nesnesini kullanma olanağına da sahipsiniz. yazmaya izin veriliyorsa yazılacak dosya meta verilerinin bir alt kümesini içerir. Veri bütünlüğünü sağlamak veya dosya türü veya boyutu gibi uygulama kısıtlamalarını uygulamak için bu iki değeri kullanabilirsiniz.

resource nesnesindeki özelliklerin tam listesi aşağıda mevcuttur:

Mülk Tip Tanım
name sicim Nesnenin tam adı
bucket sicim Bu nesnenin bulunduğu paketin adı.
generation int Bu nesnenin Google Cloud Storage nesnesi oluşturma .
metageneration int Bu nesnenin Google Cloud Storage nesne meta üretimi .
size int Bayt cinsinden nesnenin boyutu.
timeCreated zaman damgası Bir nesnenin oluşturulduğu zamanı temsil eden zaman damgası.
updated zaman damgası Bir nesnenin en son güncellendiği zamanı temsil eden zaman damgası.
md5Hash sicim Nesnenin MD5 karması.
crc32c sicim Nesnenin crc32c karması.
etag sicim Bu nesneyle ilişkili etag.
contentDisposition sicim Bu nesneyle ilişkili içerik düzeni.
contentEncoding sicim Bu nesneyle ilişkili içerik kodlaması.
contentLanguage sicim Bu nesneyle ilişkili içerik dili.
contentType sicim Bu nesneyle ilişkili içerik türü.
metadata harita<dize, dize> Geliştirici tarafından belirlenen ek özel meta verilerin anahtar/değer çiftleri.

request.resource generation , metageneration , etag , timeCreated ve updated dışında bunların tümünü içerir.

Cloud Firestore ile geliştirin

Diğer yetkilendirme kriterlerini değerlendirmek için Cloud Firestore'daki belgelere erişebilirsiniz.

firestore.get() ve firestore.exists() işlevlerini kullanarak güvenlik kurallarınız, Cloud Firestore'daki belgelere karşı gelen istekleri değerlendirebilir. firestore.get() ve firestore.exists() işlevlerinin her ikisi de tam olarak belirlenmiş belge yolları bekler. firestore.get() ve firestore.exists() için yollar oluşturmak amacıyla değişkenleri kullanırken, $(variable) sözdizimini kullanarak değişkenlerden açıkça çıkış yapmanız gerekir.

Aşağıdaki örnekte, dosyalara okuma erişimini belirli kulüplere üye olan kullanıcılarla kısıtlayan bir kural görüyoruz.

service firebase.storage {
  match /b/{bucket}/o {
    match /users/{club}/files/{fileId} {
      allow read: if club in
        firestore.get(/databases/(default)/documents/users/$(request.auth.id)).memberships
    }
  }
}
Bir sonraki örnekte, kullanıcının fotoğraflarını yalnızca arkadaşları görebilir.
service firebase.storage {
  match /b/{bucket}/o {
    match /users/{userId}/photos/{fileId} {
      allow read: if
        firestore.exists(/databases/(default)/documents/users/$(userId)/friends/$(request.auth.id))
    }
  }
}

Bu Cloud Firestore işlevlerini kullanan ilk Bulut Depolama Güvenlik Kurallarınızı oluşturup kaydettiğinizde, Firebase konsolunda veya Firebase CLI'de iki ürünü bağlama izinlerini etkinleştirmeniz istenir.

Firebase Güvenlik Kurallarını Yönetme ve dağıtma bölümünde açıklandığı gibi bir IAM rolünü kaldırarak bu özelliği devre dışı bırakabilirsiniz.

Verileri doğrula

Cloud Storage için Firebase Güvenlik Kuralları, dosya adı ve yolunun yanı sıra contentType ve size gibi dosya meta veri özelliklerinin doğrulanması da dahil olmak üzere veri doğrulama için de kullanılabilir.

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/.*');
    }
  }
}

Özel işlevler

Firebase Güvenlik Kurallarınız daha karmaşık hale geldikçe, koşul kümelerini kural kümenizde yeniden kullanabileceğiniz işlevlere sarmak isteyebilirsiniz. Güvenlik kuralları özel işlevleri destekler. Özel işlevlerin sözdizimi biraz JavaScript'e benzer, ancak Firebase Güvenlik Kuralları işlevleri, bazı önemli sınırlamalara sahip, alana özgü bir dilde yazılmıştır:

  • Fonksiyonlar yalnızca tek bir return deyimi içerebilir. Herhangi bir ek mantık içeremezler. Örneğin döngüleri yürütemez veya harici hizmetleri arayamazlar.
  • İşlevler, tanımlandıkları kapsamdaki işlevlere ve değişkenlere otomatik olarak erişebilir. Örneğin, service firebase.storage kapsamında tanımlanan bir işlevin resource değişkenine erişimi vardır ve yalnızca Cloud Firestore için get() ve exists() gibi yerleşik işlevlere erişim vardır.
  • Fonksiyonlar diğer fonksiyonları çağırabilir ancak yinelenmeyebilir. Toplam çağrı yığını derinliği 10 ile sınırlıdır.
  • rules2 sürümünde işlevler, let anahtar sözcüğünü kullanarak değişkenleri tanımlayabilir. İşlevler herhangi bir sayıda let bağlamasına sahip olabilir, ancak bir return ifadesiyle bitmeleri gerekir.

Bir işlev, function anahtar sözcüğüyle tanımlanır ve sıfır veya daha fazla bağımsız değişken alır. Örneğin, yukarıdaki örneklerde kullanılan iki tür koşulu tek bir fonksiyonda birleştirmek isteyebilirsiniz:

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();
    }
  }
}

Firebase Güvenlik Kurallarınızdaki işlevleri kullanmak, kurallarınızın karmaşıklığı arttıkça bu kuralların daha sürdürülebilir olmasını sağlar.

Sonraki adımlar

Koşullarla ilgili bu tartışmanın ardından Kurallar hakkında daha kapsamlı bir anlayışa sahip olursunuz ve şunları yapmaya hazırsınız:

Temel kullanım durumlarını nasıl ele alacağınızı öğrenin ve Kuralları geliştirmeye, test etmeye ve dağıtmaya yönelik iş akışını öğrenin: