Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

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

जल्दी शुरू

सरल नियमों वाले कुछ बुनियादी परीक्षण मामलों के लिए, क्विकस्टार्ट नमूना आज़माएं।

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

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

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

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

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

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

Cloud Firestore सुरक्षा नियमों के बारे में अधिक जानें Cloud Firestore सुरक्षा नियमों के साथ आरंभ करें

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

क्लाउड फायरस्टोर एमुलेटर स्थापित करने के लिए, फायरबेस सीएलआई का उपयोग करें और नीचे कमांड चलाएँ:

firebase setup:emulators:firestore

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

अपनी कार्यशील निर्देशिका में एक फायरबेस प्रोजेक्ट प्रारंभ करके प्रारंभ करें। फायरबेस सीएलआई का उपयोग करते समय यह एक सामान्य पहला कदम है।

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 बनाती है, जो एक क्लाइंट की तरह व्यवहार करती है जो प्रमाणीकरण के माध्यम से लॉग इन नहीं है। दिए गए संदर्भ के माध्यम से बनाए गए अनुरोधों में Firebase प्रामाणिक टोकन संलग्न नहीं होंगे।

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

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

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

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

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

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

परीक्षण रिपोर्ट तैयार करें

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

रिपोर्ट प्राप्त करने के लिए, एम्यूलेटर के चलने के दौरान एक एक्सपोज़्ड एंडपॉइंट को क्वेरी करें। ब्राउज़र के अनुकूल संस्करण के लिए, निम्न 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 नियम विफल हो जाएंगे)।

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

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

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

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

विशेष रूप से, निम्नलिखित async संचालन की समीक्षा करें:

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

जब आप पहली बार एमुलेटर लोड करते हैं तो टेस्ट केवल पास होते हैं

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

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

परीक्षण सेटअप बहुत जटिल है

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

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