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

अपना ऐप्लिकेशन बनाते समय, हो सकता है कि आप Cloud Firestore डेटाबेस. हालांकि, ऐप्लिकेशन लॉन्च करने से पहले, आपको बारीकियां देखने की ज़रूरत होगी Cloud Firestore के सुरक्षा नियम. Cloud Firestore एम्युलेटर की मदद से, प्रोटोटाइप बनाना और अपने ऐप्लिकेशन की सामान्य सुविधाओं और व्यवहार की जांच करना, आपके पास यूनिट टेस्ट लिखने का विकल्प होता है, जो आपके Cloud Firestore के सुरक्षा नियमों के व्यवहार की जांच करते हैं.

क्विकस्टार्ट

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

Cloud Firestore के सुरक्षा नियमों को समझें

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

Cloud Firestore के सुरक्षा नियमों के दो हिस्से होते हैं:

  1. match स्टेटमेंट, जो आपके डेटाबेस में मौजूद दस्तावेज़ों की पहचान करता है.
  2. एक allow एक्सप्रेशन, जो उन दस्तावेज़ों के ऐक्सेस को कंट्रोल करता है.

Firebase से पुष्टि करने की सुविधा, उपयोगकर्ताओं के क्रेडेंशियल और बुनियादी जानकारी उपयोगकर्ता और भूमिका पर आधारित ऐक्सेस सिस्टम मिलते हैं.

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

Cloud Firestore के सुरक्षा नियमों का इस्तेमाल शुरू करने में Cloud Firestore के सुरक्षा नियमों के बारे में ज़्यादा जानें.

एम्युलेटर को इंस्टॉल करें

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

firebase setup:emulators:firestore

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

सबसे पहले, अपनी वर्किंग डायरेक्ट्री में Firebase प्रोजेक्ट शुरू करें. यह है Firebase सीएलआई का इस्तेमाल करने के दौरान, इस्तेमाल करने के लिए सबसे पहले सामान्य चरण लागू होता है.

firebase init

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

firebase emulators:start --only firestore

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

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

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

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

एम्युलेटर को चलाने से पहले

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

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

लोकल यूनिट टेस्ट चलाना

v9 JavaScript SDK टूल की मदद से लोकल यूनिट टेस्ट करना

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

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

हम Node.js के नए वर्शन का इस्तेमाल करने का सुझाव देते हैं, ताकि आप async/await नोटेशन. वे सभी व्यवहार जिनका आपको टेस्ट करना चाहिए में एसिंक्रोनस फ़ंक्शन होते हैं. टेस्टिंग मॉड्यूल को इस तरह से डिज़ाइन किया गया है कि प्रॉमिस-आधारित कोड.

v9 रूल यूनिट की टेस्टिंग लाइब्रेरी को एम्युलेटर के बारे में हमेशा जानकारी रहती है और कभी भी ऐसा नहीं होता इसके अलावा, प्रोडक्शन से जुड़े संसाधनों को भी बेहतर बनाया जा सकता है.

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

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.

इंपोर्ट होने के बाद, यूनिट टेस्ट लागू करने के लिए ये काम करने की ज़रूरत होती है:

  • RulesTestEnvironment को बनाया और कॉन्फ़िगर किया जा रहा है. initializeTestEnvironment.
  • आसान सुविधा का इस्तेमाल करके, नियमों को ट्रिगर किए बिना टेस्ट डेटा सेट अप करना तरीका है, जिसकी मदद से कुछ समय के लिए इसे बायपास किया जा सकता है, 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>

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

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

जांच के इस कॉन्टेक्स्ट के लिए, इस तरीके को Firestore इंस्टेंस मिलता है. रिटर्न Firebase JS क्लाइंट SDK इंस्टेंस का इस्तेमाल, क्लाइंट SDK API (v9 मॉड्यूलर) के साथ किया जा सकता है या v9 कंपैट).

नियमों के आकलन को विज़ुअलाइज़ करना

Cloud Firestore एम्युलेटर की मदद से, क्लाइंट के अनुरोधों को एम्युलेटर सुइट का यूज़र इंटरफ़ेस (यूआई), जिसमें Firebase के सुरक्षा नियमों के लिए इवैलुएशन ट्रेसिंग भी शामिल है.

Firestore > खोलें अनुरोध टैब से, सभी समस्याओं का आकलन किया जा सकता है हर अनुरोध का क्रम तय करें.

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

टेस्ट रिपोर्ट जनरेट करना

टेस्ट का सुइट चलाने के बाद, टेस्ट को ऐक्सेस किया जा सकता है कवरेज रिपोर्ट से पता चलता है कि सुरक्षा के आपके हर नियम का आकलन कैसे किया गया.

रिपोर्ट पाने के लिए, एम्युलेटर पर बिना अनुमति के सार्वजनिक किए गए एंडपॉइंट से क्वेरी करें, जबकि अभी यह चालू है. ब्राउज़र-फ़्रेंडली वर्शन के लिए, इस यूआरएल का इस्तेमाल करें:

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

इससे आपके नियम, एक्सप्रेशन और सब-एक्सप्रेशन में बंट जाते हैं. आकलन और मानों की संख्या सहित ज़्यादा जानकारी के लिए माउसओवर वापस किया गया. इस डेटा के रॉ JSON वर्शन के लिए, यह यूआरएल शामिल करें आपकी क्वेरी में:

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

एम्युलेटर और प्रोडक्शन के बीच अंतर

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

आम तौर पर होने वाली समस्याओं को हल करना

Cloud Firestore एम्युलेटर का इस्तेमाल करने पर, आपके पास नीचे दी गई समस्याएं. अनियमित व्यवहार की समस्या को हल करने के लिए, नीचे दिए गए दिशा-निर्देशों का पालन करें अनुभव कर रहा है. ये नोट, सुरक्षा नियमों की यूनिट टेस्टिंग की मदद से लिखे गए हैं लाइब्रेरी के लिए भी बनाया गया है, लेकिन किसी भी Firebase SDK टूल पर ये सामान्य तरीके लागू किए जा सकते हैं.

जांच करने का तरीका अलग-अलग है

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

खास तौर पर, ये एक साथ काम नहीं करने वाली प्रोसेस की समीक्षा करें:

  • सुरक्षा के नियम सेट करना. जैसे, initializeTestEnvironment.
  • डेटा को पढ़ना और लिखना. जैसे, db.collection("users").doc("alice").get().
  • कार्रवाइयों से जुड़े दावे, जिनमें assertSucceeds और assertFails शामिल हैं.

एम्युलेटर को पहली बार लोड करने पर ही, जांच में पास होती हैं

एम्युलेटर को स्टेटफ़ुल तरीके से दिखाया गया है. यह मेमोरी में लिखे गए सभी डेटा को सेव करता है, इसलिए एम्युलेटर के बंद होने पर, कोई भी डेटा मिट जाता है. अगर एक से ज़्यादा विज्ञापन चलाए जा रहे हैं, तो एक ही प्रोजेक्ट आईडी के साथ की जाने वाली जांच से, हर टेस्ट ऐसा डेटा बना सकता है जो का असर बाद की टेस्टिंग पर पड़ता है. इनमें से किसी भी तरीके का इस्तेमाल करके, इसे बायपास करें:

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

टेस्ट सेटअप करना बहुत मुश्किल है

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

इसके बाद, आपकी जांच से पुष्टि हो चुकी है या पुष्टि नहीं हुई है के तौर पर कार्रवाइयां की जा सकती हैं RulesTestEnvironment.authenticatedContext और unauthenticatedContext का इस्तेमाल करने वाले उपयोगकर्ता क्रम से. इससे आपको यह पुष्टि करने की सुविधा मिलती है कि आपके Cloud Firestore के सुरक्षा नियमों की अनुमति है / अस्वीकार कर दी गई है अलग-अलग मामलों को सही ढंग से दर्ज किया है.