Catch up on highlights from Firebase at Google I/O 2023. Learn more

अपने Cloud Firestore सुरक्षा नियमों का परीक्षण करें

जैसा कि आप अपना ऐप बना रहे हैं, हो सकता है कि आप अपने क्लाउड फायरस्टोर डेटाबेस तक पहुंच को लॉक करना चाहें। हालाँकि, लॉन्च करने से पहले, आपको अधिक सूक्ष्म क्लाउड फायरस्टोर सुरक्षा नियमों की आवश्यकता होगी। क्लाउड फायरस्टोर एमुलेटर के साथ, आपके ऐप की सामान्य सुविधाओं और व्यवहार का प्रोटोटाइप और परीक्षण करने के अलावा, आप यूनिट परीक्षण लिख सकते हैं जो आपके क्लाउड फायरस्टोर सुरक्षा नियमों के व्यवहार की जांच करते हैं।

जल्दी शुरू

सरल नियमों के साथ कुछ मूलभूत परीक्षण मामलों के लिए, त्वरित प्रारंभ नमूना आज़माएं.

क्लाउड फायरस्टोर सुरक्षा नियमों को समझें

जब आप मोबाइल और वेब क्लाइंट लाइब्रेरी का उपयोग करते हैं तो सर्वर रहित प्रमाणीकरण, प्राधिकरण और डेटा सत्यापन के लिए फायरबेस प्रमाणीकरण और क्लाउड फायरस्टोर सुरक्षा नियम लागू करें।

क्लाउड फायरस्टोर सुरक्षा नियमों में दो भाग शामिल हैं:

  1. एक match विवरण जो आपके डेटाबेस में दस्तावेज़ों की पहचान करता है।
  2. एक allow अभिव्यक्ति जो उन दस्तावेज़ों तक पहुंच को नियंत्रित करती है।

फायरबेस प्रमाणीकरण उपयोगकर्ताओं की साख की पुष्टि करता है और उपयोगकर्ता-आधारित और भूमिका-आधारित एक्सेस सिस्टम के लिए आधार प्रदान करता है।

किसी भी डेटा को पढ़ने या लिखने से पहले क्लाउड फायरस्टोर मोबाइल/वेब क्लाइंट लाइब्रेरी से प्रत्येक डेटाबेस अनुरोध का मूल्यांकन आपके सुरक्षा नियमों के विरुद्ध किया जाता है। यदि नियम निर्दिष्ट दस्तावेज़ पथों में से किसी तक पहुँच से इनकार करते हैं, तो संपूर्ण अनुरोध विफल हो जाता है।

क्लाउड फायरस्टोर सुरक्षा नियमों के बारे में क्लाउड फायरस्टोर सुरक्षा नियमों के साथ आरंभ करें में अधिक जानें।

एमुलेटर स्थापित करें

Cloud Firestore एम्युलेटर को इंस्टॉल करने के लिए, Firebase CLI का इस्तेमाल करें और नीचे दी गई कमांड चलाएं:

firebase setup:emulators:firestore

एमुलेटर चलाएँ

अपनी वर्किंग डायरेक्टरी में फायरबेस प्रोजेक्ट को इनिशियलाइज़ करके शुरू करें। Firebase CLI का उपयोग करते समय यह एक सामान्य पहला कदम है।

firebase init

निम्न आदेश का उपयोग करके एमुलेटर प्रारंभ करें। जब तक आप प्रक्रिया को मार नहीं देते तब तक एमुलेटर चलेगा:

firebase emulators:start --only firestore

कई मामलों में आप एमुलेटर शुरू करना चाहते हैं, एक टेस्ट सूट चलाएं, और टेस्ट रन के बाद एम्यूलेटर को बंद कर दें। आप इसे emulators:exec आदेश:

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

प्रारंभ होने पर एमुलेटर डिफ़ॉल्ट पोर्ट (8080) पर चलने का प्रयास करेगा। आप अपने firebase.json फ़ाइल के "emulators" अनुभाग को संशोधित करके एमुलेटर पोर्ट को बदल सकते हैं:

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

एमुलेटर चलाने से पहले

इससे पहले कि आप एमुलेटर का उपयोग करना शुरू करें, निम्नलिखित बातों का ध्यान रखें:

  • एमुलेटर शुरू में आपके firebase.json फ़ाइल के firestore.rules फ़ील्ड में निर्दिष्ट नियमों को लोड करेगा। यह आपके क्लाउड फायरस्टार सुरक्षा नियमों वाली एक स्थानीय फ़ाइल के नाम की अपेक्षा करता है और उन नियमों को सभी परियोजनाओं पर लागू करता है। यदि आप स्थानीय फ़ाइल पथ प्रदान नहीं करते हैं या नीचे बताए अनुसार loadFirestoreRules विधि का उपयोग करते हैं, तो एमुलेटर सभी परियोजनाओं को खुले नियमों के रूप में मानता है।
  • जबकि अधिकांश फायरबेस एसडीके सीधे एमुलेटर के साथ काम करते हैं, केवल @firebase/rules-unit-testing लाइब्रेरी सुरक्षा नियमों में मॉकिंग auth समर्थन करती है, जिससे यूनिट परीक्षण बहुत आसान हो जाता है। इसके अलावा, पुस्तकालय कुछ एमुलेटर-विशिष्ट सुविधाओं का समर्थन करता है, जैसे कि नीचे सूचीबद्ध सभी डेटा को साफ़ करना।
  • एमुलेटर क्लाइंट एसडीके के माध्यम से प्रदान किए गए उत्पादन फायरबेस ऑथ टोकन को भी स्वीकार करेंगे और तदनुसार नियमों का मूल्यांकन करेंगे, जो एकीकरण और मैनुअल परीक्षणों में आपके एप्लिकेशन को सीधे एमुलेटर से जोड़ने की अनुमति देता है।

स्थानीय इकाई परीक्षण चलाएँ

v9 JavaScript SDK के साथ स्थानीय इकाई परीक्षण चलाएँ

फायरबेस अपने संस्करण 9 जावास्क्रिप्ट एसडीके और इसके संस्करण 8 एसडीके दोनों के साथ एक सुरक्षा नियम इकाई परीक्षण पुस्तकालय वितरित करता है। लाइब्रेरी एपीआई काफी अलग हैं। हम v9 परीक्षण लाइब्रेरी की अनुशंसा करते हैं, जो अधिक सुव्यवस्थित है और एमुलेटर से कनेक्ट करने के लिए कम सेटअप की आवश्यकता होती है और इस प्रकार उत्पादन संसाधनों के आकस्मिक उपयोग से सुरक्षित रूप से बचती है। पश्चगामी संगतता के लिए, हम v8 परीक्षण लाइब्रेरी को उपलब्ध कराना जारी रखते हैं।

स्थानीय रूप से चलने वाले एमुलेटर के साथ इंटरैक्ट करने के लिए @firebase/rules-unit-testing मॉड्यूल का उपयोग करें। यदि आपको टाइमआउट या ECONNREFUSED त्रुटियां मिलती हैं, तो दोबारा जांच लें कि एमुलेटर वास्तव में चल रहा है या नहीं।

हम दृढ़ता से Node.js के हाल के संस्करण का उपयोग करने की सलाह देते हैं ताकि आप async/await संकेतन का उपयोग कर सकें। आप जिन व्यवहारों का परीक्षण करना चाहते हैं उनमें से लगभग सभी में अतुल्यकालिक कार्य शामिल हैं, और परीक्षण मॉड्यूल को वादा-आधारित कोड के साथ काम करने के लिए डिज़ाइन किया गया है।

v9 रूल्स यूनिट टेस्टिंग लाइब्रेरी हमेशा इम्यूलेटर के बारे में जागरूक रहती है और कभी भी आपके उत्पादन संसाधनों को नहीं छूती है।

आप v9 मॉड्यूलर आयात विवरण का उपयोग करके लाइब्रेरी आयात करते हैं। उदाहरण के लिए:

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.

एक बार आयात किए जाने के बाद, इकाई परीक्षणों को लागू करने में शामिल हैं:

  • initializeTestEnvironment पर कॉल के साथ एक RulesTestEnvironment बनाना और कॉन्फ़िगर करना।
  • नियमों को ट्रिगर किए बिना परीक्षण डेटा सेट करना, एक सुविधा विधि का उपयोग करके जो आपको अस्थायी रूप से उन्हें बायपास करने की अनुमति देता है, RulesTestEnvironment.withSecurityRulesDisabled
  • टेस्ट डेटा और पर्यावरण को साफ करने के लिए कॉल के साथ हुक के पहले/बाद में टेस्ट सूट और प्रति-टेस्ट सेट अप करना, जैसे RulesTestEnvironment.cleanup() या RulesTestEnvironment.clearFirestore()
  • उन परीक्षण मामलों को लागू करना जो RulesTestEnvironment.authenticatedContext और RulesTestEnvironment.unauthenticatedContext कॉन्टेक्स्ट का उपयोग करके प्रमाणीकरण की नकल करते हैं।

सामान्य तरीके और उपयोगिता कार्य

v9 SDK में एमुलेटर-विशिष्ट परीक्षण विधियों को भी देखें।

initializeTestEnvironment() => RulesTestEnvironment

यह फ़ंक्शन नियम इकाई परीक्षण के लिए एक परीक्षण वातावरण आरंभ करता है। टेस्ट सेटअप के लिए पहले इस फ़ंक्शन को कॉल करें। सफल निष्पादन के लिए एमुलेटर चलाने की आवश्यकता होती है।

फ़ंक्शन TestEnvironmentConfig को परिभाषित करने वाली एक वैकल्पिक वस्तु को स्वीकार करता है, जिसमें एक प्रोजेक्ट आईडी और एमुलेटर कॉन्फ़िगरेशन सेटिंग्स शामिल हो सकती हैं।

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

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

यह विधि एक RulesTestContext बनाता है, जो प्रमाणित प्रमाणीकरण उपयोगकर्ता की तरह व्यवहार करता है। लौटाए गए संदर्भ के माध्यम से किए गए अनुरोधों में नकली प्रमाणीकरण टोकन संलग्न होगा। वैकल्पिक रूप से, ऑथेंटिकेशन टोकन पेलोड के लिए कस्टम दावों या ओवरराइड को परिभाषित करने वाला ऑब्जेक्ट पास करें।

किसी भी कॉन्फ़िगर किए गए एमुलेटर इंस्टेंस को एक्सेस करने के लिए अपने परीक्षणों में लौटाए गए परीक्षण संदर्भ ऑब्जेक्ट का उपयोग करें, जिसमें 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

यह विधि एक RulesTestContext बनाता है, जो प्रमाणीकरण के माध्यम से लॉग इन नहीं होने वाले क्लाइंट की तरह व्यवहार करता है। लौटाए गए संदर्भ के माध्यम से बनाए गए अनुरोधों में फायरबेस ऑथ टोकन संलग्न नहीं होंगे।

किसी भी कॉन्फ़िगर किए गए एमुलेटर इंस्टेंस को एक्सेस करने के लिए अपने परीक्षणों में लौटाए गए परीक्षण संदर्भ ऑब्जेक्ट का उपयोग करें, जिसमें 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()

ऐसे संदर्भ के साथ परीक्षण सेटअप फ़ंक्शन चलाएँ जो ऐसा व्यवहार करता है मानो सुरक्षा नियम अक्षम किए गए हों.

यह विधि एक कॉलबैक फ़ंक्शन लेती है, जो सुरक्षा-नियमों को दरकिनार करते हुए संदर्भ लेती है और एक वादा लौटाती है। वादा हल/अस्वीकार होने पर संदर्भ नष्ट हो जाएगा।

RulesTestEnvironment.cleanup()

यह विधि परीक्षण वातावरण में बनाए गए सभी RulesTestContexts नष्ट कर देती है और अंतर्निहित संसाधनों को साफ कर देती है, जिससे एक स्वच्छ निकास की अनुमति मिलती है।

यह विधि किसी भी तरह से एमुलेटर की स्थिति को नहीं बदलती है। परीक्षणों के बीच डेटा को रीसेट करने के लिए, एप्लिकेशन एमुलेटर-विशिष्ट स्पष्ट डेटा पद्धति का उपयोग करें।

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

यह एक टेस्ट केस यूटिलिटी फंक्शन है।

फ़ंक्शन का दावा है कि एक एमुलेटर ऑपरेशन को लपेटने वाले आपूर्ति किए गए वादे को सुरक्षा नियमों के उल्लंघन के बिना हल किया जाएगा।

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

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

यह एक टेस्ट केस यूटिलिटी फंक्शन है।

फ़ंक्शन का दावा है कि एक एमुलेटर ऑपरेशन को लपेटने वाला आपूर्ति किया गया वादा सुरक्षा नियमों के उल्लंघन के साथ खारिज कर दिया जाएगा।

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

एमुलेटर-विशिष्ट तरीके

v9 SDK में सामान्य परीक्षण विधियों और उपयोगिता कार्यों को भी देखें।

RulesTestEnvironment.clearFirestore() => Promise<void>

यह विधि फायरस्टार डेटाबेस में डेटा को साफ करती है जो कि फायरस्टोर एमुलेटर के लिए कॉन्फ़िगर किए गए projectId से संबंधित है।

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

इस विधि को इस परीक्षण संदर्भ के लिए फायरस्टोर उदाहरण मिलता है। लौटाए गए फायरबेस जेएस क्लाइंट एसडीके उदाहरण का उपयोग क्लाइंट एसडीके एपीआई (वी 9 मॉड्यूलर या वी 9 कंपैट) के साथ किया जा सकता है।

नियमों के मूल्यांकन की कल्पना करें

क्लाउड फायरस्टोर एमुलेटर आपको फायरबेस सुरक्षा नियमों के मूल्यांकन ट्रेसिंग सहित एमुलेटर सूट यूआई में क्लाइंट अनुरोधों की कल्पना करने देता है।

प्रत्येक अनुरोध के लिए विस्तृत मूल्यांकन क्रम देखने के लिए फायरस्टोर > अनुरोध टैब खोलें।

फायरस्टोर एम्यूलेटर अनुरोध मॉनिटर सुरक्षा नियमों का मूल्यांकन दिखा रहा है

परीक्षण रिपोर्ट उत्पन्न करें

परीक्षणों का एक सूट चलाने के बाद, आप परीक्षण कवरेज रिपोर्ट तक पहुंच सकते हैं जो दिखाती है कि आपके प्रत्येक सुरक्षा नियम का मूल्यांकन कैसे किया गया था।

रिपोर्ट प्राप्त करने के लिए, एम्यूलेटर के चलने के दौरान एक खुला समापन बिंदु पूछें। ब्राउज़र-अनुकूल संस्करण के लिए, निम्न URL का उपयोग करें:

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

यह आपके नियमों को अभिव्यक्तियों और उप-अभिव्यक्तियों में विभाजित करता है जिन्हें आप अधिक जानकारी के लिए माउसओवर कर सकते हैं, जिसमें मूल्यांकन की संख्या और लौटाए गए मान शामिल हैं। इस डेटा के अपरिष्कृत JSON संस्करण के लिए, निम्न URL को अपनी क्वेरी में शामिल करें:

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

एमुलेटर और उत्पादन के बीच अंतर

  1. आपको स्पष्ट रूप से Cloud Firestore प्रोजेक्ट बनाने की आवश्यकता नहीं है। एमुलेटर स्वचालित रूप से एक्सेस किए गए किसी भी उदाहरण को बनाता है।
  2. क्लाउड फायरस्टोर एमुलेटर सामान्य फायरबेस प्रमाणीकरण प्रवाह के साथ काम नहीं करता है। इसके बजाय, फायरबेस टेस्ट एसडीके में, हमने rules-unit-testing पुस्तकालय में initializeTestApp() विधि प्रदान की है, जो एक auth फ़ील्ड लेती है। इस पद्धति का उपयोग करके बनाया गया फायरबेस हैंडल ऐसा व्यवहार करेगा जैसे आपने जो भी इकाई प्रदान की है, उसे सफलतापूर्वक प्रमाणित कर दिया गया है। यदि आप null पास करते हैं, तो यह एक अप्रमाणित उपयोगकर्ता के रूप में व्यवहार करेगा ( auth != null नियम विफल हो जाएंगे, उदाहरण के लिए)।

ज्ञात समस्याओं का निवारण करें

जैसा कि आप क्लाउड फायरस्टोर एमुलेटर का उपयोग करते हैं, आप निम्नलिखित ज्ञात समस्याओं में भाग सकते हैं। आप जिस भी अनियमित व्यवहार का अनुभव कर रहे हैं उसका निवारण करने के लिए नीचे दिए गए दिशा-निर्देशों का पालन करें। ये नोट सुरक्षा नियम इकाई परीक्षण पुस्तकालय को ध्यान में रखकर लिखे गए हैं, लेकिन सामान्य दृष्टिकोण किसी भी फायरबेस एसडीके पर लागू होते हैं।

परीक्षण व्यवहार असंगत है

यदि आपके परीक्षण कभी-कभी उत्तीर्ण और विफल हो रहे हैं, भले ही परीक्षणों में कोई परिवर्तन न हो, तो आपको यह सत्यापित करने की आवश्यकता हो सकती है कि वे ठीक से अनुक्रमित हैं। एमुलेटर के साथ अधिकांश इंटरैक्शन एसिंक्रोनस होते हैं, इसलिए दोबारा जांचें कि सभी एसिंक्स कोड ठीक से अनुक्रमित हैं। आप या तो वादों की श्रृंखला बनाकर, या उदारतापूर्वक await संकेतन का उपयोग करके अनुक्रमण को ठीक कर सकते हैं।

विशेष रूप से, निम्नलिखित एसिंक्स कार्रवाइयों की समीक्षा करें:

  • सुरक्षा नियमों को सेट करना, उदाहरण के लिए, initializeTestEnvironment
  • डेटा पढ़ना और लिखना, उदाहरण के लिए, db.collection("users").doc("alice").get()
  • assertSucceeds और assertFails सहित परिचालन अभिकथन।

इम्यूलेटर को पहली बार लोड करने पर ही टेस्ट पास होते हैं

एमुलेटर स्टेटफुल है। यह इसमें लिखे सभी डेटा को मेमोरी में स्टोर करता है, इसलिए जब भी एमुलेटर बंद होता है तो कोई भी डेटा खो जाता है। यदि आप एक ही प्रोजेक्ट आईडी के विरुद्ध कई परीक्षण चला रहे हैं, तो प्रत्येक परीक्षण डेटा उत्पन्न कर सकता है जो बाद के परीक्षणों को प्रभावित कर सकता है। इस व्यवहार को बायपास करने के लिए आप निम्न विधियों में से किसी का भी उपयोग कर सकते हैं:

  • प्रत्येक परीक्षण के लिए अद्वितीय प्रोजेक्ट आईडी का उपयोग करें। ध्यान दें कि यदि आप ऐसा करना चुनते हैं तो आपको प्रत्येक परीक्षण के हिस्से के रूप में initializeTestEnvironment कॉल करने की आवश्यकता होगी; नियम केवल डिफ़ॉल्ट प्रोजेक्ट आईडी के लिए स्वचालित रूप से लोड होते हैं।
  • अपने परीक्षणों को पुनर्व्यवस्थित करें ताकि वे पहले लिखे गए डेटा के साथ इंटरैक्ट न करें (उदाहरण के लिए, प्रत्येक परीक्षण के लिए एक अलग संग्रह का उपयोग करें)।
  • परीक्षण के दौरान लिखे गए सभी डेटा को मिटा दें।

टेस्ट सेटअप बहुत जटिल है

अपना परीक्षण सेट अप करते समय, हो सकता है कि आप डेटा को इस तरह से संशोधित करना चाहें कि आपके क्लाउड फायरस्टोर सुरक्षा नियम वास्तव में इसकी अनुमति नहीं देते हैं। यदि आपके नियम परीक्षण सेटअप को जटिल बना रहे हैं, तो अपने सेटअप चरणों में RulesTestEnvironment.withSecurityRulesDisabled का उपयोग करने का प्रयास करें, इसलिए पढ़ना और लिखना PERMISSION_DENIED त्रुटियों को ट्रिगर नहीं करेगा।

उसके बाद, आपका परीक्षण क्रमशः RulesTestEnvironment.authenticatedContext और unauthenticatedContext का उपयोग करके एक प्रमाणीकृत या अप्रमाणित उपयोगकर्ता के रूप में संचालन कर सकता है। यह आपको यह सत्यापित करने की अनुमति देता है कि आपके क्लाउड फायरस्टार सुरक्षा नियम अलग-अलग मामलों को सही ढंग से अनुमति/अस्वीकार करते हैं।