Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

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

Uygulamanızı oluştururken Cloud Firestore veritabanınıza erişimi kilitlemek isteyebilirsiniz. Ancak, başlatmadan önce daha ayrıntılı 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 senaryosu için hızlı başlangıç ​​örneğini deneyin.

Cloud Firestore Güvenlik Kurallarını Anlayın

Mobil ve web istemci 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ı 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 kontrol eden bir allow ver ifadesi.

Firebase Authentication, kullanıcıların kimlik bilgilerini doğrular ve kullanıcı tabanlı ve rol tabanlı erişim sistemleri için temel sağlar.

Bir Cloud Firestore mobil/web istemci kitaplığından gelen her veritabanı isteği, herhangi bir veriyi okumadan veya yazmadan ö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ını Kullanmaya Başlarken bölümünde Cloud Firestore Güvenlik Kuralları hakkında daha fazla bilgi edinin.

öykünücüyü yükleyin

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

öykünücüyü çalıştırın

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

firebase emulators:start --only firestore

Çoğu durumda öykünücüyü başlatmak, bir test paketi çalıştırmak ve ardından testler çalıştırıldıktan sonra öykünücüyü kapatmak istersiniz. Bunu emulators:exec komutunu kullanarak kolayca yapabilirsiniz:

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

Başlatıldığında, öykünücü varsayılan bir bağlantı noktasında (8080) çalıştırmayı dener. 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"
    }
  }
}

Öykünücüyü çalıştırmadan önce

Öykünücüyü kullanmaya başlamadan önce aşağıdakileri aklınızda bulundurun:

  • Öykünücü başlangıçta firebase.json dosyanızın firestore.rules alanında belirtilen kuralları yükler. 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 aşağıda açıklandığı gibi loadFirestoreRules yöntemini kullanmazsanız, öykünücü tüm projeleri açık kurallara sahip olarak değerlendirir.
  • İken en Firebase SDK'leri benzeticileri olan çalışma doğrudan, sadece @firebase/rules-unit-testing alay kütüphane destekleri auth Güvenlik Kuralları, birim testleri çok daha kolay hale getirildi. Ayrıca kitaplık, aşağıda listelendiği gibi tüm verileri temizleme gibi öykünücüye özgü birkaç özelliği destekler.
  • Öykünücüler ayrıca İstemci SDK'ları aracılığıyla sağlanan üretim Firebase Auth belirteçlerini kabul edecek ve kuralları buna göre değerlendirecek, bu da uygulamanızı entegrasyon ve manuel testlerde doğrudan öykünücülere bağlamanıza olanak tanır.

Yerel testleri çalıştırın

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

Bu yöntem, seçeneklerde belirtilen proje kimliğine ve yetkilendirme değişkenine karşılık gelen, başlatılmış bir Firebase uygulaması döndürür. Testlerde kullanmak üzere 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 işlemleri gerçekleştirirken 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ılmış 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, kuralları yerel olarak çalışan bir veritabanına gönderir. Kuralları dize olarak belirten bir nesne 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 söz verir. Bir veritabanı okuma veya yazma işleminin başarısız olduğunu belirtmek 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ı olan ve giriş reddedilirse reddedilen bir söz verir. Bir veritabanının okuma veya yazma işleminin başarılı olup olmadığını belirtmek 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şturun

Bir dizi test çalıştırdı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ü çalışırken açıkta kalan bir uç noktayı 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ı, değerlendirme sayısı ve döndürülen değerler de dahil olmak üzere daha fazla bilgi için fareyle üzerine gelebileceğiniz ifadelere ve alt ifadelere böler. 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. Öykünücü, 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 rules-unit-testing kitaplığında 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ı giderme

Cloud Firestore öykünücüsünü kullanırken aşağıdaki bilinen sorunlarla karşılaşabilirsiniz. Karşılaştığınız herhangi bir düzensiz davranışı gidermek için aşağıdaki yönergeleri izleyin. Bu notlar Firebase Test SDK'sı düşünülerek yazılmıştır, ancak genel yaklaşımlar tüm Firebase SDK'ları için geçerlidir.

Test davranışı tutarsız

Testleriniz ara sıra geçiyor ve başarısız oluyorsa, testlerin kendisinde herhangi bir değişiklik olmasa bile, bunların düzgün bir şekilde sıralandığını doğrulamanız gerekebilir. Öykünücüyle olan etkileşimlerin çoğu eşzamansızdır, bu nedenle tüm eşzamansız kodun düzgün şekilde sıralandığını iki kez kontrol edin. Sıralamayı, vaatleri zincirleyerek veya await notasyonunu özgürce kullanarak düzeltebilirsiniz.

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

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

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

Öykünücü durum bilgilidir. Kendisine yazılan tüm verileri bellekte saklar, böylece öykünücü her kapandığında tüm veriler kaybolur. Aynı proje kimliğine karşı birden çok test çalıştırıyorsanız, her test sonraki testleri etkileyebilecek veriler üretebilir. Bu davranışı atlamak için aşağıdaki yöntemlerden herhangi birini kullanabilirsiniz:

  • Her test için benzersiz proje kimlikleri kullanın. Bunu yapmayı seçerseniz, her testin bir parçası olarak loadFirestoreRules çağırmanız loadFirestoreRules ; kurallar yalnızca varsayılan proje kimliği için otomatik olarak yüklenir.
  • 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çekten izin vermediği senaryoları test etmek isteyebilirsiniz. Örneğin, kimliği doğrulanmamış bir kullanıcı olarak verileri düzenleyemeyeceğiniz için, kimliği doğrulanmamış kullanıcıların verileri düzenleyip düzenleyemeyeceğini test etmek zordur.

Kurallarınız test 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ş istemcilerden okuma ve yazma işlemleri kuralları atlar ve PERMISSION_DENIED hatalarını tetiklemez.