Firebase Security Rules, ऐक्सेस कंट्रोल और डेटा की पुष्टि करने की सुविधा देता है. यह सुविधा, कई लेवल की जटिलता को सपोर्ट करने वाले फ़ॉर्मैट में उपलब्ध है. उपयोगकर्ता और भूमिका के आधार पर ऐक्सेस सिस्टम बनाने के लिए, Firebase Security Rules के साथ Firebase Authentication का इस्तेमाल करें. इससे आपके उपयोगकर्ताओं का डेटा सुरक्षित रहता है.
उपयोगकर्ताओं की पहचान करना
Authentication, आपके डेटा को ऐक्सेस करने का अनुरोध करने वाले उपयोगकर्ताओं की पहचान करता है. साथ ही, उस जानकारी को एक वैरिएबल के तौर पर उपलब्ध कराता है जिसका इस्तेमाल आपके नियमों में किया जा सकता है. auth वैरिएबल में यह जानकारी शामिल होती है:
uid: अनुरोध करने वाले उपयोगकर्ता को असाइन किया गया यूनीक यूज़र आईडी.token: Authentication से इकट्ठा की गई वैल्यू का मैप.
auth.token वैरिएबल में ये वैल्यू शामिल होती हैं:
| फ़ील्ड | ब्यौरा |
|---|---|
email |
खाते से जुड़ा ईमेल पता, अगर मौजूद हो. |
email_verified |
true, अगर उपयोगकर्ता ने पुष्टि की है कि उसके पास email पते का ऐक्सेस है. ईमेल की सेवा देने वाली कुछ कंपनियां, अपने मालिकाना हक वाले ईमेल पतों की पुष्टि अपने-आप कर लेती हैं. |
phone_number |
खाते से जुड़ा फ़ोन नंबर, अगर मौजूद हो. |
name |
उपयोगकर्ता का डिसप्ले नेम, अगर सेट किया गया हो. |
sub |
उपयोगकर्ता का Firebase यूआईडी. यह किसी प्रोजेक्ट में यूनीक होता है. |
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;
}
}
Authentication में कस्टम क्लेम बनाने के बाद, Security Rules में कस्टम क्लेम ऐक्सेस किए जा सकते हैं. इसके बाद, 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;
}
}
Security Rules का इस्तेमाल करने वाले बुनियादी Authentication के ज़्यादा उदाहरण देखने के लिए, सुरक्षा के बुनियादी नियम देखें.