Google is committed to advancing racial equity for Black communities. See how.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Cloud Firestore Güvenlik Kurallarınızı test edin

Uygulamanızı oluştururken Cloud Firestore veritabanınıza erişimi kilitlemek isteyebilirsiniz. Ancak, lansmandan önce daha nüanslı Cloud Firestore Güvenlik Kurallarına ihtiyacınız olacak. Cloud Firestore öykünücüsü ile Cloud Firestore Güvenlik Kurallarınızın davranışını kontrol eden birim testleri yazabilirsiniz.

Hızlı başlangıç

Basit kurallara sahip birkaç temel test örneği için, JavaScript hızlı başlatmayı veya TypeScript hızlı başlatmayı deneyin.

Cloud Firestore Güvenlik Kurallarını Anlama

Mobil ve web istemcisi kitaplıklarını kullanırken sunucusuz kimlik doğrulama, yetkilendirme ve veri doğrulama için Firebase Kimlik Doğrulaması ve Cloud Firestore Güvenlik Kurallarını uygulayın .

Cloud Firestore Güvenlik Kuralları iki parça içerir:

  1. Veritabanınızdaki belgeleri tanımlayan bir match ifadesi.
  2. Bu belgelere erişimi denetleyen bir allow ifadesi.

Firebase Kimlik Doğrulaması, kullanıcıların kimlik bilgilerini doğrular ve kullanıcı tabanlı ve rol tabanlı erişim sistemleri için temel oluşturur.

Cloud Firestore mobil / web istemci kitaplığından gelen her veritabanı isteği, herhangi bir veri okunmadan veya yazılmadan önce güvenlik kurallarınıza göre değerlendirilir. Kurallar, belirtilen belge yollarından herhangi birine erişimi reddederse, tüm istek başarısız olur.

Cloud Firestore Güvenlik Kuralları hakkında daha fazla bilgi için Cloud Firestore Güvenlik Kurallarını kullanmaya başlayın .

Emülatörü kurun

Cloud Firestore öykünücüsünü yüklemek için Firebase CLI'yi kullanın ve aşağıdaki komutu çalıştırın:

firebase setup:emulators:firestore

Emülatörü çalıştırın

Aşağıdaki komutu kullanarak öykünücüyü başlatın. Öykünücü, siz işlemi öldürene kadar çalışır:

firebase emulators:start --only firestore

Çoğu durumda öykünücüyü başlatmak, bir sınama paketi çalıştırın ve sınamadan sonra öykünücüyü kapatın. emulators:exec komutunu kullanarak bunu kolayca yapabilirsiniz:

firebase emulators:exec --only firestore "./my-test-script.sh"

Başlatıldığında emülatör varsayılan bir bağlantı noktasında (8080) çalışmaya çalışır. firebase.json dosyanızın "emulators" bölümünü değiştirerek öykünücü bağlantı noktasını değiştirebilirsiniz:

{
  // ...
  "emulators": {
    "firestore": {
      "port": "YOUR_PORT"
    }
  }
}

Emülatörü çalıştırmadan önce

Emülatörü kullanmaya başlamadan önce aşağıdakileri unutmayın:

  • Emülatör başlangıçta firebase.json dosyanızın firestore.rules alanında belirtilen kuralları firebase.json . Cloud Firestore Güvenlik Kurallarınızı içeren yerel bir dosyanın adını bekler ve bu kuralları tüm projelere uygular. Yerel dosya yolunu sağlamazsanız veya loadFirestoreRules yöntemini aşağıda açıklandığı gibi kullanırsanız, öykünücü tüm projeleri açık kurallar olarak görür.
  • İken birçok SDK'lar öykünücüsünü yalnızca çalışmak @firebase/testing alay node.js modülü destekler auth birimi testleri çok daha kolay hale Güvenlik Kuralları. Ayrıca, modül aşağıda listelenen tüm verileri silmek gibi emülatöre özgü birkaç özelliği destekler.
  • Emülatörler ayrıca İstemci SDK'ları aracılığıyla sağlanan üretim Firebase Auth jetonlarını kabul edecek ve kuralları buna göre değerlendirecek, bu da uygulamanızı entegrasyon ve manuel testlerde doğrudan emülatörlere bağlamaya izin verecektir.

Yerel testleri çalıştırın

initializeTestApp({ projectId: string, auth: Object }) => FirebaseApp

Bu yöntem, seçeneklerde belirtilen proje kimliğine ve kimlik doğrulama değişkenine karşılık gelen başlatılmış bir Firebase uygulaması döndürür. Testlerde kullanılacak belirli bir kullanıcı olarak kimliği doğrulanmış bir uygulama oluşturmak için bunu kullanın.

firebase.initializeTestApp({
  projectId: "my-test-project",
  auth: { uid: "alice", email: "alice@example.com" }
});

initializeAdminApp({ projectId: string }) => FirebaseApp

Bu yöntem, başlatılmış bir yönetici Firebase uygulaması döndürür. Bu uygulama, okuma ve yazma yaparken güvenlik kurallarını atlar. Testlerin durumunu ayarlamak üzere yönetici olarak kimliği doğrulanmış bir uygulama oluşturmak için bunu kullanın.

firebase.initializeAdminApp({ projectId: "my-test-project" });
    

apps() => [FirebaseApp] Bu yöntem, şu anda başlatılan tüm test ve yönetici uygulamalarını döndürür. Testler arasında veya sonrasında uygulamaları temizlemek için bunu kullanın.

Promise.all(firebase.apps().map(app => app.delete()))

loadFirestoreRules({ projectId: string, rules: Object }) => Promise

Bu yöntem, yerel olarak çalışan bir veritabanına kurallar gönderir. Kuralları dize olarak belirten bir nesneyi alır. Veritabanınızın kurallarını ayarlamak için bu yöntemi kullanın.

firebase.loadFirestoreRules({
  projectId: "my-test-project",
  rules: fs.readFileSync("/path/to/firestore.rules", "utf8")
});
    

assertFails(pr: Promise) => Promise

Bu yöntem, giriş başarılı olursa reddedilen veya giriş reddedilirse başarılı olan bir vaat döndürür. Bir veritabanının okuma veya yazma işleminin başarısız olduğunu doğrulamak için bunu kullanın.

firebase.assertFails(app.firestore().collection("private").doc("super-secret-document").get());
    

assertSucceeds(pr: Promise) => Promise

Bu yöntem, giriş başarılı olursa başarılı olur ve giriş reddedilirse reddedilir. Bir veritabanının okuma veya yazma işleminin başarılı olup olmadığını denetlemek için bunu kullanın.

firebase.assertSucceeds(app.firestore().collection("public").doc("test-document").get());
    

clearFirestoreData({ projectId: string }) => Promise

Bu yöntem, yerel olarak çalışan Firestore örneğinde belirli bir projeyle ilişkili tüm verileri temizler. Testlerden sonra temizlemek için bu yöntemi kullanın.

firebase.clearFirestoreData({
  projectId: "my-test-project"
});
   

Test raporları oluşturma

Bir dizi test yaptıktan sonra, güvenlik kurallarınızın her birinin nasıl değerlendirildiğini gösteren test kapsamı raporlarına erişebilirsiniz.

Raporları almak için, öykünücüde açıkta kalan bir bitiş noktasını sorgulayın. Tarayıcı dostu bir sürüm için aşağıdaki URL'yi kullanın:

http://localhost:8080/emulator/v1/projects/<project_id>:ruleCoverage.html

Bu, kurallarınızı, döndürülen değerlendirme sayısı ve değerler de dahil olmak üzere daha fazla bilgi için fareyle üzerine getirebileceğiniz ifadelere ve alt ifadelere ayırır. Bu verilerin ham JSON sürümü için sorgunuza aşağıdaki URL'yi ekleyin:

http://localhost:8080/emulator/v1/projects/<project_id>:ruleCoverage

Emülatör ve üretim arasındaki farklar

  1. Açıkça bir Cloud Firestore projesi oluşturmanız gerekmez. Emülatör, erişilen herhangi bir örneği otomatik olarak oluşturur.
  2. Cloud Firestore öykünücüsü, normal Firebase Kimlik Doğrulama akışıyla çalışmaz. Bunun yerine, Firebase Test SDK'sında, bir auth alanı alan test modülünde initializeTestApp() yöntemini sağladık. Bu yöntem kullanılarak oluşturulan Firebase tanıtıcısı, sağladığınız varlık olarak başarıyla doğrulanmış gibi davranacaktır. null değerini iletirseniz, kimliği doğrulanmamış bir kullanıcı gibi davranır (örneğin auth != null kuralları başarısız olur).

Bilinen sorunları giderin

Cloud Firestore öykünücüsünü kullandıkça, aşağıdaki bilinen sorunlarla karşılaşabilirsiniz. Karşılaştığınız düzensiz davranışlarla ilgili sorunları gidermek için aşağıdaki talimatları izleyin. Bu notlar Firebase Test SDK'sı göz önünde bulundurularak yazılmıştır, ancak genel yaklaşımlar tüm Firebase SDK'ları için geçerlidir.

Test davranışı tutarsız

Testleriniz zaman zaman geçiyor ve başarısız oluyorsa, testlerin kendisinde herhangi bir değişiklik yapılmasa bile, bunların doğru sıralandığını doğrulamanız gerekebilir. Emülatör ile etkileşimlerin çoğu eşzamansızdır, bu nedenle tüm eşzamansız kodun doğru sıralandığını iki kez kontrol edin. Ya vaat zincirleme veya kullanarak sıralamaya düzeltebilir await bolca gösterimi.

Özellikle, aşağıdaki zaman uyumsuz işlemleri gözden geçirin:

  • Güvenlik kurallarını ayarlama, örneğin firebase.loadFirestoreRules .
  • Verileri okuma ve yazma, örneğin, db.collection("users").doc("alice").get() .
  • firebase.assertSucceeds ve firebase.assertFails dahil olmak üzere operasyonel iddialar.

Testler yalnızca öykünücüyü ilk kez yüklediğinizde geçer

Emülatör durumludur. Kendisine yazılan tüm verileri bellekte saklar, böylece emülatör her kapatıldığında veriler kaybolur. Aynı proje kimliğine karşı birden fazla test çalıştırıyorsanız, her test sonraki testleri etkileyebilecek veriler üretebilir. Bu davranışı atlamak için aşağıdaki yöntemlerden birini kullanabilirsiniz:

  • Her test için benzersiz proje kimlikleri kullanın.
  • Testlerinizi önceden yazılmış verilerle etkileşime girmeyecek şekilde yeniden yapılandırın (örneğin, her test için farklı bir koleksiyon kullanın).
  • Test sırasında yazılan tüm verileri silin.

Test kurulumu çok karmaşık

Cloud Firestore Güvenlik Kurallarınızın gerçekte izin vermediği senaryoları test etmek isteyebilirsiniz. Örneğin, kimliği doğrulanmamış kullanıcıların verileri düzenleyip düzenleyemediğini test etmek zordur, çünkü verileri kimliği doğrulanmamış bir kullanıcı olarak düzenleyemezsiniz.

Kurallarınız sınama kurulumunu karmaşık hale getiriyorsa, kuralları atlamak için yönetici tarafından yetkilendirilmiş bir istemci kullanmayı deneyin. Bunu firebase.initializeAdminApp ile firebase.initializeAdminApp . Yönetici tarafından yetkilendirilmiş istemciler baypas kurallarını okur ve yazar ve PERMISSION_DENIED hatalarını tetiklemez.