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

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

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

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

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

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

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

पुष्टि करना

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

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

अनुमति देना

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

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

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

रीयलटाइम डेटाबेस के सुरक्षा नियमों में, पहले से मौजूद वैरिएबल और फ़ंक्शन शामिल होते हैं. इनकी मदद से, अन्य पाथ, सर्वर-साइड टाइमस्टैंप, पुष्टि करने की जानकारी वगैरह का रेफ़रंस दिया जा सकता है. यहां एक नियम का उदाहरण दिया गया है जो /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"]
    }
  }
}

अगले चरण