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

Uygulamanızı oluştururken, Cloud Firestore veritabanı. Ancak lansmandan önce daha fazla ayrıntıya ihtiyacınız olacak. Cloud Firestore Güvenlik Kuralları. Prototip oluşturmaya ek olarak, Cloud Firestore emülatörü ile ve uygulamanızın genel özelliklerini ve davranışını test etmek, Cloud Firestore Güvenlik Kurallarınızın davranışını kontrol eden birim testleri yazabilirsiniz.

Hızlı başlangıç kılavuzu

Basit kurallar içeren birkaç temel test durumu için hızlı başlangıç örneğini deneyin.

Cloud Firestore Güvenlik Kurallarını Anlama

Firebase Authentication'ı uygulayın ve Sunucular için Cloud Firestore Güvenlik Kuralları ve veri doğrulama, kimlik doğrulama, yetkilendirme ve veri doğrulama gibi bulunur.

Cloud Firestore Güvenlik Kuralları iki parçadan oluşur:

  1. Veritabanınızdaki dokümanları tanımlayan match ifadesi.
  2. Bu dokümanlara erişimi kontrol eden bir allow ifadesi.

Firebase Authentication, kullanıcıların giriş bilgisi sunar ve erişim sistemlerini geliştirecek ve geliştirecektir.

Cloud Firestore mobil/web istemci kitaplığından gelen her veritabanı isteği verileri okumadan veya yazmadan önce güvenlik kurallarınıza göre değerlendirilir. Kurallar, belirtilen doküman yollarından herhangi birine erişime izin vermezse, dokümanın tamamı isteği başarısız olur.

Cloud Firestore Güvenlik Kurallarını kullanmaya başlama bölümünde Cloud Firestore Güvenlik Kuralları hakkında daha fazla bilgi edinebilirsiniz.

Emülatörü yükleme

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

firebase setup:emulators:firestore

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

Çalışma dizininizde bir Firebase projesini başlatarak başlayın. Bu, Firebase CLI kullanırken genel ilk adım.

firebase init

Aşağıdaki komutu kullanarak emülatörü başlatın. Emülatör çalıştırılacak siz işlemi sonlandırana kadar:

firebase emulators:start --only firestore

Çoğu durumda emülatörü başlatmak, test paketi çalıştırmak ve ardından emülatörde kapatılmaya devam eder. Bunu, emulators:exec komutu:

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

Başlatıldığında emülatör varsayılan bir bağlantı noktası (8080) üzerinde çalışmayı dener. Şunları yapabilirsiniz: uygulamanızın "emulators" bölümünü değiştirerek emülatör bağlantı noktasını değiştirin firebase.json dosyası:

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

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

Emülatörü kullanmaya başlamadan önce aşağıdakileri göz önünde bulundurun:

  • Emülatör, başlangıçta firestore.rules içinde belirtilen kuralları yükler alanına (firebase.json dosyanızın) yapıştırın. Bunun için Cloud Firestore Güvenlik Kurallarınızı içeren yerel bir dosya oluşturur ve bu kuralları tüm bilgi edinmenizi sağlar. Yerel dosya yolunu belirtmezseniz veya loadFirestoreRules yöntemini kullanıyorsanız emülatör, açık kurallara sahip olarak düşünebiliriz.
  • Bu sırada Firebase SDK'larının çoğu emülatörlerle doğrudan çalıştığından, yalnızca @firebase/rules-unit-testing kitaplığı tarafından Güvenlik Kuralları'nda sahte auth olarak ayarlar ve birim testlerini çok daha kolay hale getirir. Ayrıca, kitaplık, tüm verileri temizleme, emülatöre özgü bazı özellikleri, aşağıda gösterildiği gibidir.
  • Emülatörler, sağlanan üretim Firebase Auth jetonlarını da kabul eder aracılığıyla bağlantı kurabilir ve kuralları uygun şekilde değerlendirebilirsiniz. Bu da uygulamanızı doğrudan entegrasyon ve manuel testlerde emülatörlere

Yerel birim testlerini çalıştırma

v9 JavaScript SDK ile yerel birim testleri çalıştırma

Firebase, Güvenlik Kuralları birimi test kitaplığını hem kendi sürümüyle dağıtır 9 JavaScript SDK'sı ve sürüm 8 SDK'sı. Kitaplık API'leri önemli ölçüde yardımcı olur. Daha basit ve daha basit olan v9 test kitaplığını öneririz. emülatörlere bağlanmak için daha az kurulum gerektirir ve bu sayede kazara olabilecek üretim kaynaklarının kullanılmasıdır. Geriye dönük uyumluluk için mevcut v8 test kitaplığı.

Emülatörle etkileşimde bulunmak için @firebase/rules-unit-testing modülünü kullanın yerel olarak çalışan bir web sitesidir. Zaman aşımları veya ECONNREFUSED hata alırsanız tekrar kontrol edin emin olun.

Node.js'yi kullanabilmek için yeni bir sürüm async/await gösterimi. Test etmek isteyebileceğiniz davranışların neredeyse tümü eş zamansız fonksiyonlar içerir. Test modülü de Vaat tabanlı kod.

v9 Kural Birimi Testi kitaplığı emülatörlerden her zaman haberdar olur ve ve prodüksiyon kaynaklarınız ile bağlantılı olması gerekir.

Kitaplığı, v9 modüler içe aktarma ifadelerini kullanarak içe aktarırsınız. Örneğin:

import {
  assertFails,
  assertSucceeds,
  initializeTestEnvironment
} from "@firebase/rules-unit-testing"

// Use `const { … } = require("@firebase/rules-unit-testing")` if imports are not supported
// Or we suggest `const testing = require("@firebase/rules-unit-testing")` if necessary.

İçe aktarma işleminden sonra, birim testlerinin uygulanması şunları içerir:

  • Şuna çağrı içeren bir RulesTestEnvironment oluşturma ve yapılandırma: initializeTestEnvironment.
  • Kolaylık kullanarak test verilerini Kuralları tetiklemeden ayarlama bunları geçici olarak atlamanızı sağlayan bir yöntem kullanıyorsanız RulesTestEnvironment.withSecurityRulesDisabled
  • test verilerini ve ortamını temizleyin (ör. RulesTestEnvironment.cleanup()) veya RulesTestEnvironment.clearFirestore().
  • Kimlik doğrulama durumlarını taklit eden test durumları uygulama RulesTestEnvironment.authenticatedContext ve RulesTestEnvironment.unauthenticatedContext.

Sık kullanılan yöntemler ve fayda işlevleri

Ayrıca v9 SDK'sındaki emülatöre özel test yöntemlerine de bakın.

initializeTestEnvironment() => RulesTestEnvironment

Bu işlev, kural birimi testi için bir test ortamı başlatır. Bunu ara işlevini kullanın. Başarılı yürütme için emülatörlerin çalışıyor.

İşlev, TestEnvironmentConfig tanımlayan isteğe bağlı bir nesneyi kabul eder Bu kod, proje kimliği ve emülatör yapılandırma ayarlarından oluşabilir.

let testEnv = await initializeTestEnvironment({
  projectId: "demo-project-1234",
  firestore: {
    rules: fs.readFileSync("firestore.rules", "utf8"),
  },
});

RulesTestEnvironment.authenticatedContext({ user_id: string, tokenOptions?: TokenOptions }) => RulesTestContext

Bu yöntem, kimliği doğrulanmış bir RulesTestContext Kimlik doğrulama kullanıcısı. Döndürülen bağlam aracılığıyla oluşturulan istekler örnek olarak sunulur Kimlik doğrulama jetonu eklendi. İsteğe bağlı olarak, özel hak talepleri tanımlayan bir nesne iletin veya Kimlik doğrulama jetonu yüklerini geçersiz kılar.

Herhangi bir emülatöre erişmek için testlerinizde döndürülen test bağlamı nesnesini kullanın initializeTestEnvironment ile yapılandırılanlar dahil olmak üzere örnek yapılandırıldı.

// Assuming a Firestore app and the Firestore emulator for this example
import { setDoc } from "firebase/firestore";

const alice = testEnv.authenticatedContext("alice", { … });
// Use the Firestore instance associated with this context
await assertSucceeds(setDoc(alice.firestore(), '/users/alice'), { ... });

RulesTestEnvironment.unauthenticatedContext() => RulesTestContext

Bu yöntem, RulesTestContext gibi çalışan bir istemciyi oluşturur. Kimlik Doğrulaması aracılığıyla giriş yapılmamış. Döndürülen bağlam üzerinden oluşturulan istekler Firebase Auth jetonları ekli olmalıdır.

Herhangi bir emülatöre erişmek için testlerinizde döndürülen test bağlamı nesnesini kullanın initializeTestEnvironment ile yapılandırılanlar dahil olmak üzere örnek yapılandırıldı.

// Assuming a Cloud Storage app and the Storage emulator for this example
import { getStorage, ref, deleteObject } from "firebase/storage";

const alice = testEnv.unauthenticatedContext();

// Use the Cloud Storage instance associated with this context
const desertRef = ref(alice.storage(), 'images/desert.jpg');
await assertSucceeds(deleteObject(desertRef));

RulesTestEnvironment.withSecurityRulesDisabled()

Güvenlik Kuralları gibi davranan bağlama sahip bir test kurulum işlevi çalıştırın devre dışı bırakıldı.

Bu yöntem, Security-Kuralları atlamayı alan ve bir vaat veriyor. Söz verildikten sonra bağlam kaldırılır çözümlenir / reddeder.

RulesTestEnvironment.cleanup()

Bu yöntem test ortamında oluşturulan tüm RulesTestContexts öğelerini kaldırır ve temel kaynakları temizleyerek temiz bir çıkış yapılmasını sağlar.

Bu yöntem, emülatörlerin durumunu hiçbir şekilde değiştirmez. Verileri sıfırlamak için testler arasında uygulama emülatörüne özgü temiz veri yöntemini kullanın.

assertSucceeds(pr: Promise<any>)) => Promise<any>

Bu, bir test durumu yardımcı işlevidir.

İşlev, sağlanan Promise'in bir emülatör işlemini sarmaladığını doğrular hiçbir Güvenlik Kuralı ihlali yapılmadan çözülecektir.

await assertSucceeds(setDoc(alice.firestore(), '/users/alice'), { ... });

assertFails(pr: Promise<any>)) => Promise<any>

Bu, bir test durumu yardımcı işlevidir.

İşlev, sağlanan Promise'in bir emülatör işlemini sarmaladığını doğrular kullanıcı Güvenlik Kuralları'nın ihlali durumunda reddedilecektir.

await assertFails(setDoc(alice.firestore(), '/users/bob'), { ... });

Emülatöre özel yöntemler

Ayrıca v9 SDK'sındaki yaygın test yöntemlerini ve yardımcı program işlevlerine de bakın.

RulesTestEnvironment.clearFirestore() => Promise<void>

Bu yöntem Firestore veritabanındaki Firestore emülatörü için projectId yapılandırıldı.

RulesTestContext.firestore(settings?: Firestore.FirestoreSettings) => Firestore;

Bu yöntem, bu test bağlamı için bir Firestore örneği alır. Döndürülen Firebase JS İstemci SDK'sı örneği, istemci SDK API'leriyle kullanılabilir (v9 modüler) veya v9 uyumluluğu).

Kural değerlendirmelerini görselleştirme

Cloud Firestore emülatörü, istemci isteklerini Emulator Suite kullanıcı arayüzünde, Firebase Güvenlik Kuralları için değerlendirme takibi gibi özellikler bulunur.

Firestore > Ayrıntılı değerlendirmeyi görüntülemek için İstekler sekmesini tıklayın her istek için geçerli olur.

Güvenlik Kuralları değerlendirmelerini gösteren Firestore Emulator İstek Monitörü

Test raporları oluşturma

Bir dizi test çalıştırdıktan sonra teste erişebilirsiniz. kapsam raporları arasında yer alır.

Raporları almak için, çalışırken emülatörde açık uç noktayı sorgulayın. çalışıyor. 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ı daha sonra kolayca kullanabileceğiniz ifadelere ve alt ifadelere Değerlendirme ve değer sayısı da dahil olmak üzere daha fazla bilgi için fareyle üzerine gelin geri döndü. Bu verilerin ham JSON sürümü için aşağıdaki URL'yi ekleyin kullanabilirsiniz:

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

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

  1. Açıkça bir Cloud Firestore projesi oluşturmanız gerekmez. Emülatör erişimi olan her örneği otomatik olarak oluşturur.
  2. Cloud Firestore emülatörü, normal Firebase Authentication akışıyla çalışmaz. Bunun yerine, Firebase Test SDK'sında initializeTestApp() yöntemini sağladık. auth alanı alan rules-unit-testing kitaplığı. Firebase herkese açık kullanıcı adı oluşturuldu gibi davranırsa, ilgili yönteme göre bu yöntemin her tür bilgi sağlar. null içinde geçerseniz şu şekilde davranır: kimliği doğrulanmamış kullanıcı (örneğin, auth != null kural başarısız olur).

Bilinen sorunları giderme

Cloud Firestore emülatörünü kullanırken aşağıdaki bilinen sorunları. Karşılaştığınız normal olmayan davranışları gidermek için aşağıdaki yönergeleri uygulayın: deneyimleme. Bu notlar, Güvenlik Kuralları birim testiyle yazılmıştır Ancak genel yaklaşımlar tüm Firebase SDK'ları için geçerlidir.

Test davranışı tutarsız

Testleriniz, herhangi bir değişiklik yapılmasa bile zaman zaman başarılı ve başarısız oluyorsa emin değilseniz, bunların doğru şekilde sıralandığını doğrulamanız gerekebilir. Emülatörle kurulan etkileşimlerin çoğu eşzamansız olduğundan, eşzamansız kod doğru şekilde sıralandığından emin olun. Sıralamayı şu iki yöntemden biriyle düzeltebilirsiniz: zincirleme vaatler kullanma veya await gösterimini rahatça kullanma.

Özellikle aşağıdaki eşzamansız işlemleri gözden geçirin:

  • Örneğin, initializeTestEnvironment ile güvenlik kuralları ayarlanıyor.
  • Veri okuma ve yazma (örneğin, db.collection("users").doc("alice").get()).
  • assertSucceeds ve assertFails dahil olmak üzere operasyonel onaylar.

Testler yalnızca emülatörü ilk kez yüklediğinizde başarılı olur

Emülatör durum bilgili. Kendisine yazılan tüm verileri hafızada depolar, emülatör kapatıldığında tüm veriler kaybolur. Birden fazla aynı proje kimliğine göre test edildiğinde, her test Ancak sonraki testleri de etkileyebilirler. Aşağıdaki yöntemlerden herhangi birini şu davranışı atlayın:

  • Her test için benzersiz proje kimlikleri kullanın. Bunu yapmayı seçerseniz, her testin parçası olarak initializeTestEnvironment öğesini çağırması gerekir; kurallar varsayılan proje kimliği için yalnızca otomatik olarak yüklenir.
  • Testlerinizi, önceden yazılmış verilerle etkileşim kurmayacak ş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

Testinizi ayarlarken verileri, testinizin gerçekleşeceği şekilde Cloud Firestore Güvenlik Kuralları, aslında izin vermiyor. Kurallarınız test kurulumu yapıyorsa karmaşık, kurulumunuzda RulesTestEnvironment.withSecurityRulesDisabled kullanmayı deneyin adımları uygulayın, böylece okuma ve yazma işlemleri PERMISSION_DENIED hatalarını tetiklemez.

Sonrasında, testiniz kimliği doğrulanmış veya kimliği doğrulanmamış RulesTestEnvironment.authenticatedContext ve unauthenticatedContext kullanan kullanıcı tıklayın. Bu sayede Cloud Firestore Güvenlik Kurallarınızın izin verdiğini veya reddettiğini doğrulayabilirsiniz doğru şekilde incelersiniz.