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. Bulut Firestore emülatörü ile uygulamanızın prototip oluşturma ve test ek olarak genel özelliklerini ve davranışlarını , kendi Bulut Firestore Güvenlik Kuralları davranışını kontrol birim testleri yazabilirsiniz.

Hızlı başlangıç

Basit kurallar ile birkaç temel test durumlar için denemek hızlı başlangıç örneği .

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

Uygulamak Firebase Kimlik ve Bulut Firestore Güvenlik Kuralları mobil ve web istemci kitaplıkları kullandığınızda Sunucusuz kimlik doğrulama, yetkilendirme ve veri doğrulama için.

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

  1. Bir match veritabanınızda Açıklamada, tanımlar belgeler.
  2. Bir allow kontroller bu belgeye erişim olduğunu ifade.

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.

Daha Bulut Firestore Güvenlik Kuralları öğrenin Bulut Firestore Güvenlik Kuralları başlayın .

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

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

firebase setup:emulators:firestore

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

Çalışma dizininizde bir Firebase projesi başlatarak başlayın. Bu yaygın bir ilk adımdır Firebase CLI kullanarak .

firebase init

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. Kolayca kullanarak yapabilirsiniz emulators:exec komutu:

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. Sen değiştirerek emülatör portunu değiştirebilir "emulators" senin bölümüne firebase.json dosyası:

{
  // ...
  "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:

  • Emülatör başlangıçta belirtilen kurallara yükleyecektir firestore.rules senin alanında firebase.json dosyası. 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ğlamak veya kullanmıyorsanız loadFirestoreRules aşağıda açıklandığı gibi yöntem, emülatör davranır açık kurallar sahip olarak tüm projeleri.
  • İ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 birim testleri çalıştırın

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

Firebase, hem sürüm 9 JavaScript SDK'sı hem de sürüm 8 SDK'sı ile bir Güvenlik Kuralları birim test kitaplığı dağıtır. Kütüphane API'leri önemli ölçüde farklıdır. Daha akıcı ve öykünücülere bağlanmak için daha az kurulum gerektiren ve böylece üretim kaynaklarının kazara kullanılmasını güvenli bir şekilde önleyen v9 test kitaplığını öneriyoruz. Geriye dönük uyumluluk için, yapmaya devam v8 test kütüphanesi mevcut .

Kullanım @firebase/rules-unit-testing olduğunu çalışır lokal emülatörü ile etkileştiği için modül. Eğer zaman aşımı veya alırsanız ECONNREFUSED hataları, emülatör aslında çalışmakta olduğunu bir kez daha kontrol.

Önemle kullanabilmesi node.js son sürümünü kullanmanızı öneririz async/await gösterimi. Test etmek isteyebileceğiniz davranışların neredeyse tamamı eşzamansız işlevleri içerir ve test modülü Promise tabanlı kodla çalışmak üzere tasarlanmıştır.

v9 Kuralları Birimi Test kitaplığı, öykünücülerin her zaman farkındadır ve üretim kaynaklarınıza asla dokunmaz.

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

import {
  assertFails,
  assertSucceeds,
  initializeTestEnvironment,
  RulesTestEnvironment,
} 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 aktarıldıktan sonra, birim testlerinin uygulanması şunları içerir:

  • Oluşturma ve yapılandırarak RulesTestEnvironment bir çağrıda bulunan initializeTestEnvironment .
  • Onlara baypas geçici olanak tanıyan bir kolaylık yöntemi kullanılarak, Kurallar tetiklemeden test verilerini ayarlama, RulesTestEnvironment.withSecurityRulesDisabled .
  • Test paketi kurma ve başına test öncesinde / çağrılarıyla kanca sonraki gibi test verilerini ve çevreyi temizlemeye RulesTestEnvironment.cleanup() veya RulesTestEnvironment.clearFirestore() .
  • Mimik kimlik devletler kullanarak o test durumları uygulanması RulesTestEnvironment.authenticatedContext ve RulesTestEnvironment.unauthenticatedContext .

Ortak yöntemler ve yardımcı işlevler

Ayrıca bkz v9 SDK'deki emülatör özgü test yöntemleri .

initializeTestEnvironment() => RulesTestEnvironment

Bu işlev, kural birimi testi için bir test ortamı başlatır. Test kurulumu için önce bu işlevi çağırın. Başarılı yürütme, öykünücülerin çalışıyor olmasını gerektirir.

Fonksiyon tanımlama, isteğe bağlı bir nesne kabul TestEnvironmentConfig proje kimliği ve emülatör yapılandırma ayarlarının 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 oluşturur RulesTestContext bir benzeri davranacağını Doğrulama kullanıcının kimlik doğrulamasını. Döndürülen bağlam aracılığıyla oluşturulan isteklere sahte bir Kimlik Doğrulama belirteci eklenir. İsteğe bağlı olarak, Kimlik Doğrulama belirteci yükleri için özel talepleri veya geçersiz kılmaları tanımlayan bir nesne iletin.

Erişmek için yapılandırılmış olanlar dahil yapılandırılmış herhangi emülatör örneklerini testlerinizde döndü Test bağlam nesnesi kullanın initializeTestEnvironment .

// 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 oluşturur RulesTestContext , hangi değil kimlik doğrulaması ile kaydedilir bir müşteri gibi davranır. Döndürülen bağlam aracılığıyla oluşturulan isteklere Firebase Auth jetonları eklenmez.

Erişmek için yapılandırılmış olanlar dahil yapılandırılmış herhangi emülatör örneklerini testlerinizde döndü Test bağlam nesnesi kullanın initializeTestEnvironment .

// 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ı devre dışı bırakılmış gibi davranan bir bağlamla bir test kurulumu işlevi çalıştırın.

Bu yöntem, Güvenlik Kurallarını atlayan bağlamı alan ve bir söz veren bir geri arama işlevi alır. Söz çözüldüğünde/reddedildiğinde bağlam yok edilecektir.

RulesTestEnvironment.cleanup()

Bu yöntem, tüm yok eder RulesTestContexts test ortamında oluşturulan ve temiz bir çıkışa olanak sağlayan temel kaynakları temizler.

Bu yöntem emülatörlerin durumunu hiçbir şekilde değiştirmez. Testler arasında verileri sıfırlamak için uygulama öykünücüsüne özel net veri yöntemini kullanın.

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

Bu bir test senaryosu yardımcı program işlevidir.

İşlev, bir öykünücü işlemi saran sağlanan Söz'ün Güvenlik Kuralları ihlali olmadan çözüleceğini iddia eder.

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

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

Bu bir test senaryosu yardımcı program işlevidir.

İşlev, bir öykünme işlemini saran sağlanan Söz'ün Güvenlik Kuralları ihlaliyle reddedileceğini iddia eder.

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

Öykünücüye özgü yöntemler

Aynı zamanda, bakınız v9 SDK'sında ortak test yöntemleri ve yardımcı işlevler .

RulesTestEnvironment.clearFirestore() => Promise<void>

Bu yöntem ait Firestore veritabanında veri temizler projectId Firestore emülatörü için yapılandırılmış.

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 Client SDK örneği, istemci SDK API'leri (v9 modüler veya v9 uyumluluğu) ile kullanılabilir.

Kural değerlendirmelerini görselleştirin

Cloud Firestore öykünücüsü, Firebase Güvenlik Kuralları için değerlendirme izleme de dahil olmak üzere, Emulator Suite Kullanıcı Arabiriminde istemci isteklerini görselleştirmenize olanak tanır.

Her istek için ayrıntılı değerlendirme sırasını görüntülemek için Firestore> İstekler sekmesini açın.

Güvenlik Kuralları değerlendirmelerini gösteren Firestore Öykünücü İstekleri İzleyicisi

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 Testi SDK'sında, sağladığımız initializeTestApp() yöntemini rules-unit-testing bir sürer kütüphane, auth alanını. 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. İçinde geçerseniz null , bu doğrulanmamış kullanıcı olarak davranacaktır ( auth != null kuralları, örneğin 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, Güvenlik Kuralları birim test kitaplığı 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. 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:

  • Örneğin, ile, güvenlik kurallarını ayarlanması, initializeTestEnvironment .
  • Örneğin, ile, okuma ve veri yazma, db.collection("users").doc("alice").get() .
  • Dahil Operasyonel iddialar, assertSucceeds ve assertFails .

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 seçerseniz aramak gerektiğini unutmayın initializeTestEnvironment her testin bir parçası olarak; 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

Testinizi kurarken, verileri Cloud Firestore Güvenlik Kurallarınızın gerçekten izin vermediği şekilde değiştirmek isteyebilirsiniz. Kurallarınızın test kurulum kompleksi yapıyorsanız, kullanmayı deneyin RulesTestEnvironment.withSecurityRulesDisabled böylece okuma ve yazma değil tetikleyecek, kurulum adımlarında PERMISSION_DENIED hataları.

Bundan sonra, test kullanılarak doğrulanmış veya doğrulanmamış kullanıcı olarak işlemlerini gerçekleştirebilir RulesTestEnvironment.authenticatedContext ve unauthenticatedContext sırasıyla. Bu, Cloud Firestore Güvenlik Kurallarınızın farklı durumlara doğru şekilde izin verdiğini/reddettiğini doğrulamanıza olanak tanır.