Firebase, Rules को मैनेज करने के लिए कई टूल उपलब्ध कराता है. इनमें से हर टूल किसी खास मामले में काम आता है. साथ ही, हर टूल एक ही बैकएंड Firebase सुरक्षा नियमों के मैनेजमेंट एपीआई का इस्तेमाल करता है.
इसे ट्रिगर करने के लिए किसी भी टूल का इस्तेमाल किया जा सकता है. हालांकि, मैनेजमेंट एपीआई:
- नियमों का सोर्स डालता है: नियमों का एक सेट, आम तौर पर Firebase Security Rules स्टेटमेंट वाली कोड फ़ाइल.
- डाले गए सोर्स को, बदलाव न किए जा सकने वाले नियमों के सेट के तौर पर सेव करता है.
- रिलीज़ में हर नियमों के सेट को डिप्लॉय करने की जानकारी ट्रैक करता है. Firebase के सुरक्षा नियमों के साथ काम करने वाली सेवाएं, किसी प्रोजेक्ट की रिलीज़ को लुकअप करती हैं, ताकि सुरक्षित संसाधन के लिए किए गए हर अनुरोध का आकलन किया जा सके.
- यह सुविधा, नियमों के सेट के सिंटैक्स और सिमेंटिक टेस्ट चलाने की सुविधा देती है.
Firebase CLI का इस्तेमाल करना
Firebase सीएलआई की मदद से, स्थानीय सोर्स अपलोड किए जा सकते हैं और रिलीज़ डिप्लॉय की जा सकती हैं. सीएलआई के Firebase Local Emulator Suite की मदद से, सोर्स की पूरी लोकल टेस्टिंग की जा सकती है.
सीएलआई का इस्तेमाल करके, अपने ऐप्लिकेशन कोड के साथ अपने नियमों को वर्शन कंट्रोल में रखा जा सकता है. साथ ही, नियमों को डिप्लॉय करने की मौजूदा प्रोसेस के हिस्से के तौर पर डिप्लॉय किया जा सकता है.
कॉन्फ़िगरेशन फ़ाइल जनरेट करना
Firebase CLI का इस्तेमाल करके Firebase प्रोजेक्ट को कॉन्फ़िगर करने पर, प्रोजेक्ट डायरेक्ट्री में एक .rules
कॉन्फ़िगरेशन फ़ाइल बनाई जाती है. अपने Firebase प्रोजेक्ट को कॉन्फ़िगर करने के लिए, नीचे दिए गए कमांड का इस्तेमाल करें:
Cloud Firestore
// Set up Firestore in your project directory, creates a .rules file firebase init firestore
Realtime Database
// Set up Realtime Database in your project directory, creates a .rules file firebase init database
Cloud Storage
// Set up Storage in your project directory, creates a .rules file firebase init storage
नियमों में बदलाव करना और उन्हें अपडेट करना
सीधे .rules
कॉन्फ़िगरेशन फ़ाइल में जाकर, नियमों के सोर्स में बदलाव करें.
पक्का करें कि Firebase सीएलआई में किए गए बदलाव, Firebase कंसोल में दिखें. इसके अलावा, यह भी पक्का करें कि Firebase कंसोल या Firebase सीएलआई, दोनों में लगातार अपडेट किए जाएं. ऐसा न करने पर, Firebase कंसोल में किए गए किसी भी अपडेट को बदला जा सकता है.
अपडेट की जांच करना
Local Emulator Suite, सुरक्षा नियमों वाले सभी प्रॉडक्ट के लिए, एमुलेटर उपलब्ध कराता है. हर एमुलेटर के लिए, सुरक्षा नियमों का इंजन, नियमों का सिंटैक्टिक और सेमांटिक, दोनों तरह का आकलन करता है. इससे, सुरक्षा नियमों के मैनेजमेंट एपीआई की ओर से दी जाने वाली सिंटैक्टिक टेस्टिंग को बेहतर बनाया जा सकता है.
अगर सीएलआई का इस्तेमाल किया जा रहा है, तो Suite Firebase Security Rules टेस्टिंग के लिए एक बेहतरीन टूल है. अपने अपडेट की स्थानीय तौर पर जांच करने के लिए, Local Emulator Suite का इस्तेमाल करें. साथ ही, यह पुष्टि करें कि आपके ऐप्लिकेशन का Rules वही व्यवहार दिखाता है जो आपको चाहिए.
अपडेट डिप्लॉय करना
Rules को अपडेट करने और उसकी जांच करने के बाद, सोर्स को प्रोडक्शन में डिप्लॉय करें.
Cloud Firestore Security Rules के लिए, firebase.json
फ़ाइल की समीक्षा करके और उसे अपडेट करके, .rules
फ़ाइलों को अपने डिफ़ॉल्ट और नाम वाले अन्य डेटाबेस से जोड़ें.
अपने Rules को चुनिंदा तौर पर डिप्लॉय करने या डिप्लॉय करने की सामान्य प्रोसेस के हिस्से के तौर पर डिप्लॉय करने के लिए, इन निर्देशों का इस्तेमाल करें.
Cloud Firestore
// Deploy rules for all databases configured in your firebase.json firebase deploy --only firestore:rules
// Deploy rules for the specified database configured in your firebase.json firebase deploy --only firestore:<databaseId>
Realtime Database
// Deploy your .rules file firebase deploy --only database
Cloud Storage
// Deploy your .rules file firebase deploy --only storage
Firebase कंसोल का इस्तेमाल करना
Firebase कंसोल से, Rules सोर्स में बदलाव किया जा सकता है और उन्हें रिलीज़ के तौर पर डिप्लॉय किया जा सकता है. Firebase कंसोल यूज़र इंटरफ़ेस (यूआई) में बदलाव करने पर, सिंटैक्स की जांच की जाती है. साथ ही, Rules प्लेग्राउंड का इस्तेमाल करके, सेमांटिक टेस्टिंग की जा सकती है.
नियमों में बदलाव करना और उन्हें अपडेट करना
- Firebase कंसोल खोलें और अपना प्रोजेक्ट चुनें.
- इसके बाद, प्रॉडक्ट नेविगेशन से Realtime Database, Cloud Firestore या स्टोरेज चुनें. इसके बाद, Rules एडिटर पर जाने के लिए, नियम पर क्लिक करें.
- सीधे एडिटर में जाकर, अपने नियमों में बदलाव करें.
अपडेट की जांच करना
एडिटर यूज़र इंटरफ़ेस (यूआई) में सिंटैक्स की जांच करने के अलावा, अपने प्रोजेक्ट के डेटाबेस और स्टोरेज संसाधनों का इस्तेमाल करके, सीधे Firebase कंसोल में, Rules प्लेग्राउंड का इस्तेमाल करके, सेमैंटिक Rules व्यवहार की जांच की जा सकती है. Rules एडिटर में, नियमों का प्लेलैंड स्क्रीन खोलें. इसके बाद, सेटिंग में बदलाव करें और चालू करें पर क्लिक करें. एडिटर में सबसे ऊपर, पुष्टि करने वाला मैसेज देखें.
अपडेट डिप्लॉय करना
जब आपको लगे कि आपके अपडेट आपकी उम्मीद के मुताबिक हैं, तब पब्लिश करें पर क्लिक करें.
Admin SDK का इस्तेमाल करना
Node.js के rulesets के लिए, Admin SDK का इस्तेमाल किया जा सकता है. प्रोग्राम के हिसाब से, अपने-आप होने वाली प्रोसेस के ऐक्सेस की मदद से, ये काम किए जा सकते हैं:
- नियमों को मैनेज करने के लिए, कस्टम टूल, स्क्रिप्ट, डैशबोर्ड, और सीआई/सीडी पाइपलाइन लागू करें.
- एक से ज़्यादा Firebase प्रोजेक्ट में नियमों को ज़्यादा आसानी से मैनेज करें.
प्रोग्राम के हिसाब से नियमों को अपडेट करते समय, अपने ऐप्लिकेशन के ऐक्सेस कंट्रोल में अनचाहे बदलाव करने से बचना ज़रूरी है. खास तौर पर, नियमों को अपडेट या डिप्लॉय करते समय, सुरक्षा को ध्यान में रखकर अपना Admin SDK कोड लिखें.
ध्यान रखने वाली एक और अहम बात यह है कि Firebase Security Rules रिलीज़ को पूरी तरह से प्रोपेगेट होने में कुछ मिनट लगते हैं. नियमों को डिप्लॉय करने के लिए Admin SDK का इस्तेमाल करते समय, रेस कंडीशन से बचने की कोशिश करें. रेस कंडीशन में, आपका ऐप्लिकेशन उन नियमों पर तुरंत भरोसा करता है जिनका डिप्लॉयमेंट अभी पूरा नहीं हुआ है. अगर आपके इस्तेमाल के उदाहरण में, ऐक्सेस कंट्रोल के नियमों को बार-बार अपडेट करने की ज़रूरत है, तो Cloud Firestore का इस्तेमाल करके समाधानों पर विचार करें. इसे बार-बार अपडेट करने के बावजूद, रेस की स्थितियों को कम करने के लिए डिज़ाइन किया गया है.
के ज़रिए अपने नियमों को अपडेट न करें.इन सीमाओं का भी ध्यान रखें:
- सीरियलाइज़ किए जाने पर, नियमों का साइज़ 256 केबी से कम होना चाहिए. साथ ही, उन्हें UTF-8 कोड में एन्कोड किया जाना चाहिए.
- किसी प्रोजेक्ट में, ज़्यादा से ज़्यादा 2,500 नियमों के सेट डिप्लॉय किए जा सकते हैं. यह सीमा पूरी होने के बाद, नए नियम बनाने से पहले आपको कुछ पुराने नियमों के सेट मिटाने होंगे.
Cloud Storage या Cloud Firestore नियमों का सेट बनाना और डिप्लॉय करना
Admin SDK की मदद से सुरक्षा नियमों को मैनेज करने के लिए, एक सामान्य वर्कफ़्लो में ये तीन अलग-अलग चरण शामिल हो सकते हैं:
- नियमों की फ़ाइल का सोर्स बनाना (ज़रूरी नहीं)
- नियमों का सेट बनाना
- नया नियम सेट अप करना या उसे डिप्लॉय करना
एसडीके, Cloud Storage और Cloud Firestore सुरक्षा नियमों के लिए, इन चरणों को एक एपीआई कॉल में जोड़ने का तरीका उपलब्ध कराता है. उदाहरण के लिए:
const source = `service cloud.firestore {
match /databases/{database}/documents {
match /carts/{cartID} {
allow create: if request.auth != null && request.auth.uid == request.resource.data.ownerUID;
allow read, update, delete: if request.auth != null && request.auth.uid == resource.data.ownerUID;
}
}
}`;
// Alternatively, load rules from a file
// const fs = require('fs');
// const source = fs.readFileSync('path/to/firestore.rules', 'utf8');
await admin.securityRules().releaseFirestoreRulesetFromSource(source);
यह पैटर्न, releaseFirestoreRulesetFromSource()
वाले Cloud Storage नियमों के लिए भी काम करता है.
इसके अलावा, इन इवेंट को बेहतर तरीके से कंट्रोल करने के लिए, रूल फ़ाइल को इन-मेमोरी ऑब्जेक्ट के तौर पर बनाया जा सकता है, रूलसेट बनाया जा सकता है, और रूलसेट को अलग से डिप्लॉय किया जा सकता है. उदाहरण के लिए:
const rf = admin.securityRules().createRulesFileFromSource('firestore.rules', source);
const rs = await admin.securityRules().createRuleset(rf);
await admin.securityRules().releaseFirestoreRuleset(rs);
Realtime Database नियमों के सेट अपडेट करना
Realtime Database के नियमों को Admin SDK के साथ अपडेट करने के लिए, admin.database
के getRules()
और
setRules()
तरीकों का इस्तेमाल करें. नियमों के सेट को JSON फ़ॉर्मैट में या टिप्पणियों के साथ स्ट्रिंग के तौर पर वापस पाया जा सकता है.
नियमों का सेट अपडेट करने के लिए:
const source = `{
"rules": {
"scores": {
".indexOn": "score",
"$uid": {
".read": "$uid == auth.uid",
".write": "$uid == auth.uid"
}
}
}
}`;
await admin.database().setRules(source);
नियमों के सेट मैनेज करना
बड़े नियमों के सेट को मैनेज करने में मदद करने के लिए, Admin SDK की मदद से admin.securityRules().listRulesetMetadata
के साथ सभी मौजूदा नियमों की सूची बनाई जा सकती है. उदाहरण के लिए:
const allRulesets = [];
let pageToken = null;
while (true) {
const result = await admin.securityRules().listRulesetMetadata(pageToken: pageToken);
allRulesets.push(...result.rulesets);
pageToken = result.nextPageToken;
if (!pageToken) {
break;
}
}
बहुत बड़े डिप्लॉयमेंट के लिए, समय के साथ नियमों की सीमा 2,500 तक पहुंच जाती है. ऐसे में, तय समय के हिसाब से सबसे पुराने नियमों को मिटाने के लिए लॉजिक बनाया जा सकता है. उदाहरण के लिए, 30 दिनों से ज़्यादा समय से डिप्लॉय किए गए सभी नियमों को मिटाने के लिए:
const thirtyDays = new Date(Date.now() - THIRTY_DAYS_IN_MILLIS);
const promises = [];
allRulesets.forEach((rs) => {
if (new Date(rs.createTime) < thirtyDays) {
promises.push(admin.securityRules().deleteRuleset(rs.name));
}
});
await Promise.all(promises);
console.log(`Deleted ${promises.length} rulesets.`);
REST API का इस्तेमाल करना
ऊपर बताए गए टूल, अलग-अलग वर्कफ़्लो के लिए सही हैं. इनमें आपके प्रोजेक्ट में मौजूद कई Cloud Firestore डेटाबेस के लिए Firebase Security Rules मैनेजमेंट भी शामिल है. हालांकि, हो सकता है कि आप मैनेजमेंट एपीआई का इस्तेमाल करके, Firebase Security Rules को मैनेज और डिप्लॉय करना चाहें. Management API की मदद से, आपको ज़्यादा सुविधाएं मिलती हैं.
इन सीमाओं का भी ध्यान रखें:
- सीरियलाइज़ किए जाने पर, नियमों का साइज़ 256 केबी से कम होना चाहिए. साथ ही, उन्हें UTF-8 कोड में एन्कोड किया जाना चाहिए.
- किसी प्रोजेक्ट में, ज़्यादा से ज़्यादा 2,500 नियमों के सेट डिप्लॉय किए जा सकते हैं. यह सीमा पूरी होने के बाद, नए नियम बनाने से पहले आपको कुछ पुराने नियमों के सेट मिटाने होंगे.
REST की मदद से Cloud Firestore या Cloud Storage नियमों का सेट बनाना और डिप्लॉय करना
इस सेक्शन में दिए गए उदाहरणों में Firestore Rules का इस्तेमाल किया गया है. हालांकि, ये उदाहरण Cloud Storage Rules पर भी लागू होते हैं.
इन उदाहरणों में, एपीआई कॉल करने के लिए cURL का भी इस्तेमाल किया गया है. पुष्टि करने वाले टोकन को सेट अप करने और पास करने का तरीका नहीं बताया गया है. रेफ़रंस दस्तावेज़ के साथ इंटिग्रेट किए गए एपीआई एक्सप्लोरर का इस्तेमाल करके, इस एपीआई को आज़माया जा सकता है.
Management API का इस्तेमाल करके, नियमों का सेट बनाने और उसे डिप्लॉय करने के लिए, ये सामान्य चरण अपनाएं:
- नियम फ़ाइल सोर्स बनाना
- नियमों का सेट बनाना
- नया नियम सेट अप करें.
सोर्स बनाना
मान लें कि आप अपने secure_commerce
Firebase प्रोजेक्ट पर काम कर रहे हैं और आपको east_store
नाम के अपने प्रोजेक्ट के डेटाबेस में, लॉक किए गए Cloud Firestore Rules को डिप्लॉय करना है.
इन नियमों को firestore.rules
फ़ाइल में लागू किया जा सकता है.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
नियमों का सेट बनाना
अब, इस फ़ाइल के लिए base64 कोड में बदला गया फ़िंगरप्रिंट जनरेट करें. इसके बाद, projects.rulesets.create
REST कॉल की मदद से नियमों का सेट बनाने के लिए ज़रूरी पेलोड को पॉप्युलेट करने के लिए, इस फ़ाइल में मौजूद सोर्स का इस्तेमाल किया जा सकता है. यहां, firestore.rules
के कॉन्टेंट को REST पेलोड में डालने के लिए, cat
कमांड का इस्तेमाल करें.
ट्रैकिंग के लिए, इसे अपने east_store
डेटाबेस से जोड़ने के लिए, attachment_point
को east_store
पर सेट करें.
curl -X POST -d '{
"source": {
"files": [
{
"content": "' $(cat storage.rules) '",
"name": "firestore.rules",
"fingerprint": <sha fingerprint>
},
"attachment_point": "firestore.googleapis.com/databases/east_store"
]
}
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets'
एपीआई, पुष्टि करने का जवाब और नियमों का नाम दिखाता है. उदाहरण के लिए,
projects/secure_commerce/rulesets/uuid123
.
नियमों का सेट रिलीज़ करना (डिप्लॉय करना)
अगर नियमों का सेट मान्य है, तो आखिरी चरण में, नाम वाली रिलीज़ में नए नियमों का सेट डिप्लॉय करना होता है.
curl -X POST -d '{
"name": "projects/secure_commerce/releases/cloud.firestore/east_store" ,
"rulesetName": "projects/secure_commerce/rulesets/uuid123"
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/releases'
ध्यान रखें कि Firebase Security Rules रिलीज़ को पूरी तरह से प्रोपेगेट होने में कुछ मिनट लगते हैं. डिप्लॉय करने के लिए, मैनेजमेंट REST API का इस्तेमाल करते समय, रेस शर्तों से बचना न भूलें. इन शर्तों में, आपका ऐप्लिकेशन उन नियमों पर तुरंत भरोसा करता है जिनका डिप्लॉयमेंट अब तक पूरा नहीं हुआ है.
REST की मदद से Realtime Database के नियमों के सेट को अपडेट करना
Realtime Database, Rules को मैनेज करने के लिए अपना REST इंटरफ़ेस उपलब्ध कराता है. REST के ज़रिए Firebase Realtime Database Rules को मैनेज करना लेख पढ़ें.
REST की मदद से नियमों के सेट मैनेज करना
बड़े पैमाने पर नियमों को लागू करने में मदद करने के लिए, मैनेजमेंट एपीआई, नियमों के सेट और रिलीज़ बनाने के लिए REST तरीके के साथ-साथ ये तरीके भी उपलब्ध कराता है:
- rulesets की सूची बनाना, उन्हें पाना, और मिटाना
- नियमों की रिलीज़ की सूची बनाना, उन्हें पाना, और मिटाना
बहुत बड़े डिप्लॉयमेंट के लिए, समय के साथ नियमों की सीमा 2,500 तक पहुंच जाती है. ऐसे में, तय समय के हिसाब से सबसे पुराने नियमों को मिटाने के लिए लॉजिक बनाया जा सकता है. उदाहरण के लिए, 30 दिनों से ज़्यादा समय से डिप्लॉय किए गए सभी नियमों को मिटाने के लिए, projects.rulesets.list
तरीके को कॉल करें. इसके बाद, Ruleset
ऑब्जेक्ट की JSON सूची को उनके createTime
बटन पर पार्स करें. इसके बाद, ruleset_id
के हिसाब से नियमों पर project.rulesets.delete
को कॉल करें.
REST की मदद से अपने अपडेट की जांच करना
आखिर में, मैनेजमेंट एपीआई की मदद से, अपने प्रोडक्शन प्रोजेक्ट में Cloud Firestore और Cloud Storage संसाधनों पर सिंटैक्स और सेमेटिक टेस्ट चलाए जा सकते हैं.
एपीआई के इस कॉम्पोनेंट की जांच में ये चीज़ें शामिल हैं:
TestCase
ऑब्जेक्ट के सेट को दिखाने के लिए,TestSuite
JSON ऑब्जेक्ट तय करनाTestSuite
सबमिट करना- दिखाए गए
TestResult
ऑब्जेक्ट को पार्स करना
आइए, testcase.json
फ़ाइल में एक TestCase
के साथ TestSuite
ऑब्जेक्ट तय करें. इस उदाहरण में, हम उन नियमों पर चलाने के लिए, Rules language source को इनलाइन में REST payload के साथ पास करते हैं. साथ ही, टेस्ट सुइट भी पास करते हैं. हम नियमों के आकलन की उम्मीद और क्लाइंट के अनुरोध के बारे में बताते हैं, जिसके आधार पर नियमों के सेट की जांच की जानी है. "पूरी" वैल्यू का इस्तेमाल करके, यह भी बताया जा सकता है कि जांच की रिपोर्ट कितनी पूरी है. इससे यह पता चलता है कि रिपोर्ट में सभी Rules भाषा के एक्सप्रेशन के नतीजे शामिल होने चाहिए. इनमें वे एक्सप्रेशन भी शामिल हैं जो अनुरोध से मेल नहीं खाते.
{ "source": { "files": [ { "name": "firestore.rules", "content": "service cloud.firestore { match /databases/{database}/documents { match /users/{userId}{ allow read: if (request.auth.uid == userId); } function doc(subpath) { return get(/databases/$(database)/documents/$(subpath)).data; } function isAccountOwner(accountId) { return request.auth.uid == accountId || doc(/users/$(request.auth.uid)).accountId == accountId; } match /licenses/{accountId} { allow read: if isAccountOwner(accountId); } } }" } ] }, "testSuite": { "testCases": [ { "expectation": "ALLOW", "request": { "auth": {"uid": "123"}, "path": "/databases/(default)/documents/licenses/abcd", "method": "get"}, "functionMocks": [ { "function": "get", "args": [{"exact_value": "/databases/(default)/documents/users/123"}], "result": {"value": {"data": {"accountId": "abcd"}}} } ] } ] } }
इसके बाद, हम इस TestSuite
को projects.test
तरीके से, आकलन के लिए सबमिट कर सकते हैं.
curl -X POST -d '{
' $(cat testcase.json) '
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets/uuid123:test'
TestReport
(इसमें जांच के सही/गलत होने की स्थिति, डीबग मैसेज की सूचियां, देखे गए नियमों के एक्सप्रेशन की सूचियां, और उनकी जांच की रिपोर्ट शामिल होती हैं) से यह पुष्टि की जाएगी कि ऐक्सेस सही तरीके से दिया गया है.
अलग-अलग सेवाओं के लिए Cloud Storage Security Rules की अनुमतियां मैनेज करना
अगर आपने Cloud Storage Security Rules बनाया है, जो सुरक्षा से जुड़ी शर्तों का आकलन करने के लिए Cloud Firestore दस्तावेज़ के कॉन्टेंट का इस्तेमाल करता है, तो आपको Firebase कंसोल या Firebase सीएलआई में, दोनों प्रॉडक्ट को कनेक्ट करने की अनुमतियां चालू करने के लिए कहा जाएगा.
अगर आपको अलग-अलग सेवाओं के बीच सुरक्षा की सुविधा बंद करनी है, तो:
सबसे पहले, इस सुविधा को बंद करने से पहले, अपने नियमों में बदलाव करें. इसके बाद, Cloud Firestore को ऐक्सेस करने के लिए Rules फ़ंक्शन का इस्तेमाल करने वाले सभी स्टेटमेंट हटाएं. अगर ऐसा नहीं किया जाता है, तो इस सुविधा के बंद होने के बाद, Rules की जांच की वजह से, आपके स्टोरेज के अनुरोध पूरे नहीं हो पाएंगे.
"Firebase Rules Firestore Service Agent" भूमिका को मिटाने के लिए, Google Cloud Console में IAM पेज का इस्तेमाल करें. इसके लिए, भूमिकाओं को रद्द करने के लिए Cloud की गाइड देखें.
अगली बार Firebase CLI या Firebase कंसोल से, कई सेवाओं के लिए लागू होने वाले नियमों को सेव करते समय, आपसे इस सुविधा को फिर से चालू करने के लिए कहा जाएगा.