Firebase रीयल टाइम डेटाबेस के सुरक्षा नियमों को समझें

Firebase Realtime Database के सुरक्षा नियमों से यह तय होता है कि आपके डेटाबेस को पढ़ने और उसमें लिखने का ऐक्सेस किसके पास है, आपका डेटा किस तरह से व्यवस्थित किया गया है, और कौनसे इंडेक्स मौजूद हैं. ये नियम Firebase सर्वर पर मौजूद होते हैं और हर समय अपने-आप लागू होते हैं. पढ़ने और लिखने का हर अनुरोध सिर्फ़ तब पूरा होगा, जब आपके नियमों के तहत इसकी अनुमति होगी. डिफ़ॉल्ट रूप से, आपके नियमों के तहत किसी को भी आपके डेटाबेस का ऐक्सेस नहीं दिया जाता. ऐसा आपके डेटाबेस को गलत इस्तेमाल से बचाने के लिए किया जाता है. ऐसा तब तक किया जाता है, जब तक आपके पास नियमों को पसंद के मुताबिक बनाने या पुष्टि करने की सुविधा सेट अप करने का समय नहीं होता.

रीयलटाइम डेटाबेस के सुरक्षा नियमों का सिंटैक्स, JavaScript जैसा होता है. ये चार तरह के होते हैं:

नियम के टाइप
.read इससे यह पता चलता है कि उपयोगकर्ताओं को डेटा पढ़ने की अनुमति कब और कब नहीं है.
.write इससे पता चलता है कि डेटा को कब और कैसे लिखा जा सकता है.
.validate इससे यह तय होता है कि सही फ़ॉर्मैट वाली वैल्यू कैसी दिखेगी, इसमें चाइल्ड एट्रिब्यूट हैं या नहीं, और डेटा टाइप क्या है.
.indexOn यह इंडेक्स करने के लिए किसी चाइल्ड के बारे में बताता है, ताकि क्रम से लगाने और क्वेरी करने में मदद मिल सके.

Realtime Database सुरक्षा की खास जानकारी

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

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

पुष्टि करना

अपने ऐप्लिकेशन को सुरक्षित बनाने के लिए, पहला सामान्य चरण यह है कि अपने उपयोगकर्ताओं की पहचान की जाए. इस प्रोसेस को प्रमाणीकरण कहा जाता है. उपयोगकर्ताओं को अपने ऐप्लिकेशन में साइन इन करने की सुविधा देने के लिए, Firebase Authentication का इस्तेमाल किया जा सकता है. Firebase Authentication में, Google और Facebook जैसे सामान्य पुष्टि करने के तरीकों के लिए ड्रॉप-इन सपोर्ट शामिल है. साथ ही, इसमें ईमेल और पासवर्ड से लॉगिन करने, बिना पहचान बताए लॉगिन करने वगैरह की सुविधा भी शामिल है.

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

अनुमति देना

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

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

.read और .write के नियम एक के बाद एक लागू होते हैं. इसलिए, नियमों का यह सेट, /foo/ पाथ के साथ-साथ /foo/bar/baz जैसे किसी भी डीपर पाथ पर मौजूद डेटा को पढ़ने का ऐक्सेस देता है. ध्यान दें कि डेटाबेस में .read और .write के ज़्यादा पाथ वाले नियमों के मुकाबले, कम पाथ वाले नियम लागू होते हैं. इसलिए, इस उदाहरण में /foo/bar/baz के लिए पढ़ने का ऐक्सेस अब भी दिया जाएगा. भले ही, /foo/bar/baz पाथ पर मौजूद किसी नियम का आकलन 'गलत' के तौर पर किया गया हो.

Realtime Database के सुरक्षा नियमों में, बिल्ट-इन वैरिएबल और फ़ंक्शन शामिल होते हैं. इनकी मदद से, अन्य पाथ, सर्वर-साइड टाइमस्टैंप, पुष्टि करने की जानकारी वगैरह को रेफ़र किया जा सकता है. यहां एक ऐसे नियम का उदाहरण दिया गया है जो पुष्टि किए गए उपयोगकर्ताओं को /users/<uid>/ में लिखने का ऐक्सेस देता है. इसमें <uid> Firebase Authentication के ज़रिए मिला उपयोगकर्ता का आईडी है.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

डेटा सत्यापन

Firebase Realtime Database में कोई स्कीमा नहीं है. इससे डेवलपमेंट के दौरान, चीज़ों को आसानी से बदला जा सकता है. हालांकि, जब आपका ऐप्लिकेशन डिस्ट्रिब्यूट करने के लिए तैयार हो जाता है, तब डेटा को एक जैसा रखना ज़रूरी होता है. नियमों की भाषा में एक .validate नियम शामिल होता है. इसकी मदद से, पुष्टि करने के लॉजिक को लागू किया जा सकता है. इसके लिए, आपको वही एक्सप्रेशन इस्तेमाल करने होंगे जो .read और .write नियमों के लिए इस्तेमाल किए जाते हैं. इनमें सिर्फ़ यह अंतर है कि पुष्टि करने के नियम एक के बाद एक लागू नहीं होते. इसलिए, लिखने की अनुमति पाने के लिए, पुष्टि करने के सभी ज़रूरी नियमों का पालन करना ज़रूरी है.

इन नियमों के मुताबिक, /foo/ में लिखा गया डेटा, 100 से कम वर्ण वाली स्ट्रिंग होनी चाहिए:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

मान्य करने के नियमों के पास, .read और .write नियमों की तरह ही, पहले से मौजूद सभी फ़ंक्शन और वैरिएबल का ऐक्सेस होता है. इनका इस्तेमाल करके, पुष्टि करने के ऐसे नियम बनाए जा सकते हैं जो आपके डेटाबेस में मौजूद अन्य डेटा, उपयोगकर्ता की पहचान, सर्वर के समय वगैरह के बारे में जानते हों.

डेटाबेस इंडेक्स तय करना

Firebase Realtime Database की मदद से, डेटा को क्रम से लगाया जा सकता है और उससे क्वेरी की जा सकती है. डेटा के छोटे साइज़ के लिए, डेटाबेस ऐड हॉक क्वेरी की सुविधा देता है. इसलिए, डेवलपमेंट के दौरान आम तौर पर इंडेक्स की ज़रूरत नहीं होती. हालांकि, ऐप्लिकेशन लॉन्च करने से पहले, आपको अपनी सभी क्वेरी के लिए इंडेक्स तय करने होंगे. इससे यह पक्का किया जा सकेगा कि ऐप्लिकेशन के बढ़ने के साथ-साथ, वे क्वेरी काम करती रहें.

इंडेक्स के बारे में जानकारी देने के लिए, .indexOn नियम का इस्तेमाल किया जाता है. यहां इंडेक्स के एलान का एक उदाहरण दिया गया है. इससे डायनासोर की सूची के लिए, ऊंचाई और लंबाई वाले फ़ील्ड को इंडेक्स किया जाएगा:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

अगले चरण