फायरस्टार: PERMISSION_DENIED: गुम या अपर्याप्त अनुमतियाँ


119

मुझे एरर मिल रहा है

getdocuments.com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: गुम या अपर्याप्त अनुमतियाँ।

नीचे दिए गए कोड के लिए अन्य विवरण पर

db.collection("users")
    .get()
    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
             if (task.isSuccessful()) {
                 for (DocumentSnapshot document : task.getResult()) {
                     s(document.getId() + " => " + document.getData());
                 }
             } else {
                 s("Error getting documents."+ task.getException());
             }
         }
     });

क्या उपयोगकर्ता लॉग इन है?
सुहैल SH

4
क्या आपने फायरबेस कंसोल में सुरक्षा टैब के तहत नियम निर्धारित किए हैं?
सुहैल SH

1
मेरी गलती, मैंने क्लाउड फायरस्टार के लिए ड्रॉप बॉक्स नहीं देखा। मैं रियलटाइम डेटाबेस में ही जाँच कर रहा था।
एस रेखू

धन्यवाद @ सुहैलशाह
एस रेखू ०

जवाबों:


173

यह बस मेरे लिए काम करता है।

डेटाबेस में जाएं -> नियम ->

allow read, write: if झूठा बदलो ; सच करने के लिए ;

नोट: यह पूरी तरह से डेटाबेस के लिए सुरक्षा बंद कर देता है!

प्रमाणीकरण के बिना इसे दुनिया के लिए योग्य बनाना !!! यह उत्पादन वातावरण के लिए अनुशंसा करने का समाधान नहीं है। केवल परीक्षण उद्देश्यों के लिए इसका उपयोग करें।


44
ध्यान दें कि यह सभी को बिना किसी प्राधिकरण के अपने डेटाबेस को पढ़ने, लिखने की अनुमति देता है।
साईं गोपी मी

104
यह एक भयानक समाधान है, यह सचमुच सुरक्षा को निष्क्रिय करता है। इसके बजाय इसे पढ़ें: firebase.google.com/docs/firestore/security/get-started
डंकन लुक

2
@ojonugwaochalifu क्योंकि यह हर किसी के लिए काम कर रहा है
लवनीश मोंगा

11
जैसे @DuncanLuk ने कहा, यह एक भयानक समाधान है। मैं इसे समाधान भी नहीं
कहूंगा

6
सबसे अच्छा समाधान वास्तव में तेजी से शुरू करने के लिए। सुरक्षा चिंताओं को बाद में वास्तव में तय किया जा सकता है।
वायाचेस्लाव डोब्रोमाइसलोव

79

डेटाबेस पर जाएँ -> नियम :

फिर नीचे नियमों में बदलाव किया गया

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

नीचे को

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

9
यह एक बुरा विचार है, यह सभी दस्तावेजों को किसी भी प्रमाणित उपयोगकर्ता द्वारा लिखने योग्य बनाता है, यहां तक ​​कि सामान जो अन्य उपयोगकर्ताओं से संबंधित है, सामान जो केवल व्यवस्थापक द्वारा लिखने योग्य होना चाहिए या कभी भी लेखन योग्य नहीं होना चाहिए। कृपया पहले कोड ऑफ कोड को रखें क्योंकि यह बिना सुरक्षा वाले नियमों के खिलाफ एक गार्ड है।
Noxxys

1
ध्यान दें कि यदि आप लोगों को साइन अप करने देते हैं (उदाहरण के लिए Google SSO के साथ) तो वे स्वचालित रूप से आपके सभी डेटा तक पहुँच प्राप्त करेंगे।
फॉरेस्टेलमैन

2
मैं अपने प्रमाणित उपयोगकर्ताओं (एक छोटी संख्या) को सभी दस्तावेजों तक पहुंचने की अनुमति देना चाहता हूं, इसलिए यह नुस्खा मेरे मामले के लिए एकदम सही है।
AFD

1
यह स्वीकृत उत्तर होना चाहिए।
ईशान

19

तो मेरे मामले में मेरे पास निम्नलिखित डीबी नियम थे:

service cloud.firestore {
  match /databases/{database}/documents {
    match /stories/{story} {
      function isSignedIn() {
        return request.auth.uid != null;
      }
    
      allow read, write: if isSignedIn() && request.auth.uid == resource.data.uid
    }
  }
}

जैसा कि आप देख सकते हैं कि वहाँ पर एक uidक्षेत्र हैstory कि मालिक को चिह्नित करने के दस्तावेज़ ।

तब मेरे कोड में मैं सभी कहानियों (स्पंदन) को उद्धृत कर रहा था:

Firestore.instance
          .collection('stories')
          .snapshots()

और यह विफल रहा क्योंकि मैंने पहले ही विभिन्न उपयोगकर्ताओं के माध्यम से कुछ कहानियां जोड़ी हैं। इसे ठीक करने के लिए आपको क्वेरी में शर्त जोड़ना होगा:

Firestore.instance
          .collection('stories')
          .where('uid', isEqualTo: user.uid)
          .snapshots()

अधिक विवरण यहां: https://firebase.google.com/docs/firestore/security/rules-query

EDIT: लिंक से

नियम फ़िल्टर नहीं हैं दस्तावेज़ों को पुनः प्राप्त करने के लिए प्रश्न लिखते समय, ध्यान रखें कि सुरक्षा नियम फ़िल्टर नहीं हैं - प्रश्न सभी या कुछ भी नहीं हैं। आपको समय और संसाधनों को बचाने के लिए, क्लाउड फायरस्टार आपके सभी दस्तावेजों के लिए वास्तविक क्षेत्र मूल्यों के बजाय इसके संभावित परिणाम सेट के खिलाफ एक क्वेरी का मूल्यांकन करता है। यदि कोई क्वेरी संभावित रूप से दस्तावेज़ों को वापस कर सकती है जिसे क्लाइंट को पढ़ने की अनुमति नहीं है, तो संपूर्ण अनुरोध विफल हो जाता है।


उपयोगकर्ता वस्तु क्या है?
फणी ऋतविज

यह सबसे अच्छा जवाब है
एलिया वीस

12

उपरोक्त वोट किए गए उत्तर आपके डेटाबेस के स्वास्थ्य के लिए खतरनाक हैं। आप अभी भी अपने डेटाबेस को केवल पढ़ने के लिए उपलब्ध करा सकते हैं और लिखने के लिए नहीं:

  service cloud.firestore {
    match /databases/{database}/documents {
     match /{document=**} {
       allow read: if true;
       allow write: if false;
      }
   }
}

1
अनुमतियों को सक्षम करने का सही तरीका क्या है, लेकिन सभी के लिए नहीं?
nyxee

8

यदि आप जावा स्विंग एप्लीकेशन में कोशिश करते हैं।

  1. जाओ करने के लिए Firebase Console> Project Overview>Project Settings

  2. इसके बाद सर्विस अकाउंट्स टैब पर जाएं और फिर न्यू प्राइवेट की जनरेट पर क्लिक करें।

  3. आपको एक .json फ़ाइल मिलेगी, इसे एक ज्ञात पथ में रखें

  4. फिर माय कंप्यूटर प्रॉपर्टीज, एडवांस्ड सिस्टम सेटिंग्स, एनवायरनमेंट वेरिएबल्स पर जाएं।

  5. GOOGLE_APPLICATION_CREDENTIALSJson फ़ाइल के लिए अपने पथ के साथ नया पथ परिवर्तनीय मान बनाएँ ।


यह मेरा मुद्दा भी था, डॉक्स पर इसके लिए जानकारी है ।
tris timb

5

npm i --save firebase @ कोणीय / अग्नि

app.module में सुनिश्चित करें कि आपने आयात किया है

import { AngularFireModule } from '@angular/fire';
import { AngularFirestoreModule } from '@angular/fire/firestore';

आयात में

AngularFireModule.initializeApp(environment.firebase),
    AngularFirestoreModule,
    AngularFireAuthModule,

वास्तविक समय में डेटाबेस नियम सुनिश्चित करें कि आपके पास है

{
  /* Visit  rules. */
  "rules": {
    ".read": true,
    ".write": true
  }
}

क्लाउड फायरस्टार नियमों में सुनिश्चित करें कि आपके पास है

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

3

सुनिश्चित करें कि आपका DB खाली नहीं है और न ही आपकी क्वेरी ऐसे संग्रह के लिए है, जिनका अस्तित्व नहीं है


8
इस अपवाद का खाली संग्रह या डीबी से कोई लेना-देना नहीं है, यह एक अनुमति का मुद्दा है
ओजोनुगा जुड ओचलिफु

इस अपवाद का खाली Db आदि के साथ कोई लेना-देना नहीं है। सुरक्षा नियमों और प्रामाणिक के साथ समस्या।
रेहान अली

इस परिदृश्य पर मेरे और कम से कम 3 अन्य लोगों के पास इसका अपवाद है। यदि यह आपकी मदद नहीं करता है, तो अगले समाधान पर आगे
बढ़ें

3

यदि आपके कोड से संग्रह संदर्भ फायरबेस पर संग्रह नाम से मेल नहीं खाता है, तो इसके अतिरिक्त, आपको यह त्रुटि मिल सकती है।

उदाहरण के लिए फायरबेस पर संग्रह का नाम है users, लेकिन आपका संदर्भ इसके साथ हैdb.collection("Users") याdb.collection("user")

यह संवेदनशील होने के साथ-साथ मामला है।

आशा है कि यह किसी की मदद करता है


क्या संग्रह का निहितार्थ नहीं है? आपके उदाहरण में "उपयोगकर्ता" और "उपयोगकर्ता" संग्रह को संदर्भित किया जाता है जब और तब बनाया जाएगा।
bdev TJ

यहां पर सूचनाएं प्राप्त की जा सकती हैं। codelabs.developers.google.com/codelabs/firestore-android/#3
bdev टीजे

@DevTJ आप सही है जब यह एक addया setअनुरोध है, लेकिन सवाल से यह एक getअनुरोध है। मैंने इससे पहले अनुभव किया है
अंगा


2

यदि कोई व्यक्ति यहां एक सेवा-खाते के साथ फायरस्टार तक पहुंचने की कोशिश कर रहा है:

मैंने GCP के IAM सेटिंग्स में भूमिका के Service Account Userअलावा सेवा-खाते को भूमिका प्रदान करके इस मुद्दे को हल किया Cloud Datastore User


2

इस समय, जून 2020 तक, डिफ़ॉल्ट रूप से फायरबेस को समय के अनुसार परिभाषित किया गया है। अपनी जरूरतों को पूरा करने के लिए समय निर्धारित करें।

allow read, write: if request.time < timestamp.date(2020, 7, 10);

कृपया ध्यान दें: आपका DB अभी भी किसी के लिए खुला है। मेरा सुझाव है, कृपया दस्तावेज़ पढ़ें और डीबी को उस तरह से कॉन्फ़िगर करें जो आपके लिए उपयोगी है।


1

समस्या यह है कि आपने उपयोगकर्ता को प्रमाणित करने से पहले डेटा को रियलटाइम डेटाबेस या फायरस्टार पर पढ़ने या लिखने की कोशिश की। कृपया अपने कोड का दायरा जांचने का प्रयास करें। आशा है कि यह मदद की!



1

मेरे लिए यह तारीख के साथ मुद्दा था। इसे अपडेट किया गया और इस मुद्दे को हल किया गया।

पढ़ने / लिखने की अनुमति दें:

 if request.time < timestamp.date(2020, 5, 21);

संपादित करें: यदि आप अभी भी भ्रमित हैं और यह पता लगाने में असमर्थ हैं कि आपके फायरबस कंसोल में नियमों के खंड पर एक नज़र क्या है।


1

समय सीमा खत्म हो सकती है

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    // This rule allows anyone on the internet to view, edit, and delete
    // all data in your Firestore database. It is useful for getting
    // started, but it is configured to expire after 30 days because it
    // leaves your app open to attackers. At that time, all client
    // requests to your Firestore database will be denied.
    //
    // Make sure to write security rules for your app before that time, or else
    // your app will lose access to your Firestore database
    match /{document=**} {
      allow read, write: if request.time < timestamp.date(2020,7, 1);
    }
  }
}

वहाँ आजकल की तारीख बदल इस पंक्ति में:

 allow read, write: if request.time < timestamp.date(2020,7, 1);


-1

इस मामले के लिए आपके नियम इस तरह होने चाहिए, हालांकि संदेश कहता है कि यह सुझाया गया तरीका नहीं है, लेकिन यदि आप ऐसा करते हैं तो आप बिना किसी त्रुटि के आवेषण कर सकते हैं

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.