सुरक्षा के नियम और Firebase से पुष्टि करने की सुविधा

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

उपयोगकर्ताओं की पहचान करना

Authentication आपके डेटा को ऐक्सेस करने का अनुरोध करने वाले उपयोगकर्ताओं की पहचान करता है. साथ ही, यह जानकारी एक वैरिएबल के तौर पर उपलब्ध कराता है, जिसका इस्तेमाल नियमों में किया जा सकता है. auth वैरिएबल में यह जानकारी शामिल होती है:

  • uid: यह उपयोगकर्ता का यूनीक आईडी होता है. यह आईडी, ऐक्सेस का अनुरोध करने वाले उपयोगकर्ता को असाइन किया जाता है.
  • token: यह Authentication से इकट्ठा की गई वैल्यू का मैप होता है.

auth.token वैरिएबल में ये वैल्यू शामिल होती हैं:

फ़ील्ड ब्यौरा
email खाते से जुड़ा ईमेल पता, अगर मौजूद हो.
email_verified अगर उपयोगकर्ता ने पुष्टि की है कि उसके पास email पते का ऐक्सेस है, तो इसकी वैल्यू true होती है. कुछ कंपनियां, अपने ईमेल पतों की पुष्टि अपने-आप कर लेती हैं.
phone_number खाते से जुड़ा फ़ोन नंबर, अगर मौजूद हो.
name उपयोगकर्ता का डिसप्ले नेम, अगर सेट किया गया हो.
sub उपयोगकर्ता का Firebase UID. यह किसी प्रोजेक्ट में यूनीक होता है.
firebase.identities यह उन सभी आइडेंटिटी की डिक्शनरी होती है जो इस उपयोगकर्ता के खाते से जुड़ी हैं. डिक्शनरी की कुंजियां इनमें से कोई भी हो सकती हैं: email, phone, google.com, facebook.com, github.com, twitter.com. डिक्शनरी की वैल्यू, खाते से जुड़ी हर आइडेंटिटी की सेवा देने वाली कंपनी के लिए यूनीक आइडेंटिफ़ायर की कलेक्शन होती हैं. उदाहरण के लिए, auth.token.firebase.identities["google.com"][0] में, खाते से जुड़ा पहला Google यूज़र आईडी शामिल होता है.
firebase.sign_in_provider यह टोकन पाने के लिए इस्तेमाल की गई साइन-इन की सेवा देने वाली कंपनी. यह इनमें से कोई एक स्ट्रिंग हो सकती है: custom, password, phone, anonymous, google.com, facebook.com, github.com, twitter.com.
firebase.tenant खाते से जुड़ा tenantId, अगर मौजूद हो. जैसे, tenant2-m6tyz

अगर आपको पुष्टि करने के लिए, अपनी पसंद के मुताबिक एट्रिब्यूट जोड़ने हैं, तो auth.token वैरिएबल में, आपकी बताई गई सभी कस्टम जानकारी भी शामिल होती है.

अगर ऐक्सेस का अनुरोध करने वाले उपयोगकर्ता ने साइन इन नहीं किया है, तो auth वैरिएबल की वैल्यू null होती है. इसका इस्तेमाल नियमों में किया जा सकता है. उदाहरण के लिए, अगर आपको पुष्टि किए गए उपयोगकर्ताओं के लिए, पढ़ने का ऐक्सेस सीमित करना है, तो auth != null का इस्तेमाल करें. हालांकि, हमारा सुझाव है कि लिखने के ऐक्सेस को और सीमित करें.

auth वैरिएबल के बारे में ज़्यादा जानने के लिए, Cloud Firestore, Realtime Database, और Cloud Storage के रेफ़रंस दस्तावेज़ देखें.

नियमों में उपयोगकर्ता की जानकारी का इस्तेमाल करना

नियमों में पुष्टि की गई जानकारी का इस्तेमाल करने से, आपके नियम ज़्यादा असरदार और फ़्लेक्सिबल बनते हैं. उपयोगकर्ता की पहचान के आधार पर, डेटा के ऐक्सेस को कंट्रोल किया जा सकता है.

अपने नियमों में यह तय करें कि auth वैरिएबल में मौजूद जानकारी — अनुरोध करने वाले उपयोगकर्ता की जानकारी — अनुरोध किए गए डेटा से जुड़ी उपयोगकर्ता की जानकारी से कैसे मेल खाती है.

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

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Make sure the uid of the requesting user matches name of the user
    // document. The wildcard expression {userId} makes the userId variable
    // available in rules.
    match /users/{userId} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

Realtime Database

{
  "rules": {
    "users": {
      "$userId": {
        // grants write access to the owner of this user account
        // whose uid must exactly match the key ($userId)
        ".write": "$userId === auth.uid"
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  // Only a user can upload their file, but anyone can view it
  match /users/{userId}/{fileName} {
    allow read;
    allow write: if request.auth != null && request.auth.uid == userId;
  }
}

उपयोगकर्ता की कस्टम जानकारी तय करना

अपने ऐप्लिकेशन के उपयोगकर्ताओं को असाइन किए गए कस्टम फ़ील्ड तय करने के लिए, auth वैरिएबल का इस्तेमाल किया जा सकता है.

उदाहरण के लिए, मान लें कि आपको "एडमिन" की भूमिका बनानी है, जिससे कुछ पाथ पर लिखने का ऐक्सेस मिलता है. आपको उपयोगकर्ताओं को वह एट्रिब्यूट असाइन करना होगा. इसके बाद, पाथ पर ऐक्सेस देने वाले नियमों में उसका इस्तेमाल करना होगा.

Cloud Firestore में, उपयोगकर्ताओं के दस्तावेज़ों में कस्टम फ़ील्ड जोड़ा जा सकता है. साथ ही, अपने नियमों में एम्बेड किए गए रीड का इस्तेमाल करके, उस फ़ील्ड की वैल्यू को वापस पाया जा सकता है . इसलिए, एडमिन के आधार पर बनाया गया आपका नियम, यहां दिए गए उदाहरण की तरह दिखेगा:

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents/some_collection: {
    // Remember that, in Cloud Firestore, reads embedded in your rules are billed operations
    write: if request.auth != null && get(/databases/(database)/documents/users/$(request.auth.uid)).data.admin == true;
    read: if request.auth != null;
  }
}

Security Rules में कस्टम जानकारी बनाने के बाद, कस्टम जानकारी को Authentication में ऐक्सेस किया जा सकता है. इसके बाद, auth.token वैरिएबल का इस्तेमाल करके, उन कस्टम जानकारी का रेफ़रंस दिया जा सकता है.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, check for an admin claim
    allow write: if request.auth.token.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if request.auth.token.reader == "true";
     allow write: if request.auth.token.writer == "true";
   }
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      "$sub_path": {
      // Create a custom claim for the admin role
      ".write": "auth.uid !== null && auth.token.writer === true",
      ".read": "auth.uid !== null"
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  // Create a custom claim for the admin role
  match /files/{fileName} {
    allow read: if request.auth.uid != null;
    allow write: if request.auth.token.admin == true;
  }
}

Authentication का इस्तेमाल करने वाले, सुरक्षा से जुड़े बुनियादी नियमों के ज़्यादा उदाहरण देखने के लिए, सुरक्षा से जुड़े बुनियादी नियम देखें.Security Rules