फायरबेस की अनुमति अस्वीकृत


123

मैं कोडिंग के लिए अपेक्षाकृत नया हूं और परेशान हूं।

मेरे पास फायरबेस में डेटा भेजने के लिए यह कोड है

app.userid = app.user.uid

var userRef = app.dataInfo.child(app.users);

var useridRef = userRef.child(app.userid);

useridRef.set({
  locations: "",
  theme: "",
  colorScheme: "",
  food: ""
});

हालाँकि, मुझे त्रुटि मिलती रहती है:

FIREBASE चेतावनी: / उपयोगकर्ताओं / (GoogleID) में सेट विफल: अनुमति_बनाया गया 2016-05-23 22: 52: 42.707 firebase.js: 227 बिना शर्त (वादा में) त्रुटि: त्रुटि की अनुमति दी गई: अनुमति से इनकार किया गया (…)

जब मैं इसे देखने की कोशिश करता हूं तो यह Firebase के नियमों के बारे में बात करता है, जो एक ऐसी भाषा में लगता है जो मैंने अभी तक नहीं सीखा है (या यह सिर्फ मेरे सिर पर जा रहा है)। क्या कोई समझा सकता है कि इस मुद्दे का कारण क्या है? मैंने सोचा था कि मैं इसे ईमेल और उपयोगकर्ता प्रदर्शन नाम को संग्रहीत करने के लिए कह रहा था और आपको बस ऐसा करने की अनुमति नहीं थी, लेकिन जब मैंने उन लोगों को निकाला तो मुझे अभी भी वही समस्या थी। क्या नियमों को निर्धारित किए बिना इस त्रुटि से बचने का एक तरीका है, या नियम कुछ हैं जो मैं खुद को सिखा सकता हूं कि मैं एक दिन में कैसे लिख सकता हूं, या क्या मैं सिर्फ अपने लीग से बाहर हूं?

किसी भी मदद के लिए धन्यवाद!

जवाबों:


250

डिफ़ॉल्ट रूप से फायरबेस कंसोल में एक परियोजना में डेटाबेस केवल प्रशासनिक उपयोगकर्ताओं (जैसे क्लाउड फ़ंक्शंस, या एक व्यवस्थापक एसडीके का उपयोग करने वाली प्रक्रियाओं) द्वारा पठनीय / लेखन योग्य है। जब तक आप सर्वर-साइड सुरक्षा नियमों को नहीं बदलते, नियमित क्लाइंट-साइड SDK के उपयोगकर्ता डेटाबेस तक नहीं पहुँच सकते।


आप नियमों को बदल सकते हैं ताकि डेटाबेस प्रमाणित उपयोगकर्ताओं द्वारा केवल पठनीय / लेखन योग्य हो:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

फायरबेस डेटाबेस सुरक्षा नियमों के लिए क्विकस्टार्ट देखें ।

लेकिन चूंकि आप अपने कोड से उपयोगकर्ता को साइन इन नहीं कर रहे हैं, डेटाबेस आपको डेटा तक पहुंच से वंचित करता है। यह हल करने के लिए कि आपको डेटाबेस तक पहुँचने से पहले या तो अपने डेटाबेस तक पहुँचने की अनुमति देनी होगी, या उपयोगकर्ता को साइन इन करना होगा।

अपने डेटाबेस में बिना अनुमति के पहुँच प्राप्त करें

पल के लिए सबसे सरल वर्कअराउंड (जब तक ट्यूटोरियल अपडेट नहीं हो जाता) आपको प्रोजेक्ट के लिए कंसोल में डेटाबेस पैनल में जाने के लिए, नियम टैब का चयन करें और इन नियमों के साथ सामग्री को प्रतिस्थापित करें:

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

यह आपके नए डेटाबेस को डेटाबेस के URL को जानने वाले किसी भी व्यक्ति द्वारा पठनीय और लिखने योग्य बनाता है। उत्पादन में जाने से पहले अपने डेटाबेस को फिर से सुरक्षित करना सुनिश्चित करें, अन्यथा किसी को इसका दुरुपयोग करना शुरू होने की संभावना है।

डेटाबेस तक पहुँचने से पहले उपयोगकर्ता में साइन इन करें

डेटाबेस को एक्सेस करने से पहले उपयोगकर्ता के हस्ताक्षर किए जाने को सुनिश्चित करने के लिए (थोड़ा) अधिक समय लेने वाली, लेकिन अधिक सुरक्षित, समाधान के लिए, फायरबेस प्रमाणीकरण के signIn...तरीकों में से एक को कॉल करें । ऐसा करने का सबसे सरल तरीका अनाम प्रमाणीकरण का उपयोग कर रहा है :

firebase.auth().signInAnonymously().catch(function(error) {
  // Handle Errors here.
  var errorCode = error.code;
  var errorMessage = error.message;
  // ...
});

और फिर साइन-इन का पता चलने पर अपने श्रोताओं को संलग्न करें

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
    var isAnonymous = user.isAnonymous;
    var uid = user.uid;
    var userRef = app.dataInfo.child(app.users);

    var useridRef = userRef.child(app.userid);

    useridRef.set({
      locations: "",
      theme: "",
      colorScheme: "",
      food: ""
    });

  } else {
    // User is signed out.
    // ...
  }
  // ...
});

1
धन्यवाद - असुरक्षित फिक्स का इस्तेमाल किया और इस Embar ट्यूटोरियल में पिछले फायरबेस अनुमति मुद्दों की प्रगति के लिए एक समान प्रश्न के उत्तर में अपना उत्तर उद्धृत किया । लेकिन हम कहां सुरक्षित (सुरक्षित) अनाम सामान्य कोड जोड़ते हैं?
डेव एवरिट

2
ओएमजी में एक घंटा लगता है। मैं वहाँ था, लेकिन मूल्यों FALSE थे ... मैं बस इसे नजरअंदाज कर दिया। उन्हें TRUE और bam में बदल दिया गया, ऐप ऐसा काम कर रहा है जैसा आप सोचेंगे ...
Andy

OMG, मुझे भी fn, यह पता नहीं चल सका कि जब वे दोनों पहले से ही झूठे थे (जब तक मैं आपकी टिप्पणी नहीं पढ़ता) उनकी अनुमति पर विफल क्यों हो रहे थे। डुह, नोब गलती।, वे दोनों सच होना चाहिए जब आप इसे जनता के लिए खोल रहे हैं (पढ़ता है)। अपनी त्रुटि को इंगित करने के लिए धन्यवाद, आपने मुझे इसका पता लगाने में मदद की। रिकॉर्ड के लिए मैंने अपना नियम इस तरह बदल दिया: ".read": सच और फिर इसने काम करना शुरू कर दिया।
कांट्रेक्टरवॉल्फ

@ एंडी थैंक्यू यार, मेरे लिए भी और आपकी टिप्पणी को देखते हुए मेरी संभावना का समाधान हो गया;)
महमूदुल हसन सोहाग

86

मैं इसी तरह के मुद्दे का सामना कर रहा था और पता चला कि यह त्रुटि वास्तविक समय डेटाबेस के लिए पढ़ने / लिखने के संचालन के लिए निर्धारित गलत नियमों के कारण थी। डिफ़ॉल्ट रूप से गूगल फायरबेस आजकल क्लाउड स्टोर लोड करता है रियल टाइम डेटाबेस नहीं। हमें वास्तविक समय पर स्विच करने और सही नियम लागू करने की आवश्यकता है।

यहाँ छवि विवरण दर्ज करें

जैसा कि हम देख सकते हैं कि क्लाउड फायरस्टार वास्तविक समय डेटाबेस नहीं कहता है, एक बार नियमों के नीचे सही डेटाबेस लागू करने के लिए स्विच किया गया है:

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

3
लानत है यूआई! मैंने पूरा दिन बिताया, मुझे लगा कि मेरे अलग नियम क्यों हैं ... आह ... यह "क्लाउड फायरस्टार" के लिए था ... धन्यवाद!
एलेक्सी वोलोडको

43

आपके द्वारा बताए गए "डेटाबेस" विकल्प पर जाएं।

  1. ब्लू हैडर पर आपको एक ड्रॉपडाउन मिलेगा जो क्लाउड फायरस्टार बीटा कहता है
  2. इसे "रियलटाइम डेटाबेस" में बदलें
  3. नियमों पर जाएं और सेट करें। दोनों को सत्य पर फैलाएं

यहां से नकल की गई ।


11

डेटाबेस पर जाएं, शीर्षक के बगल में 2 विकल्प हैं:

क्लाउड फायरस्टार, रियलटाइम डेटाबेस

रीयलटाइम डेटाबेस का चयन करें और नियमों पर जाएं

नियमों को सच में बदलें।

इससे मेरी समस्या हल हो गई।


4
  1. फायरबेस खोलें, बाएं हाथ की तरफ डेटाबेस का चयन करें।
  2. अब दाईं ओर, ड्रॉपडाउन से [रीयलटाइम डेटाबेस] चुनें और नियमों को बदलकर: {"नियम": {".read": सत्य, "। राइट करें": सच}}।

यह काम करता हैं..!!


5
यह दूसरे उत्तर में पहले ही कहा जा चुका है। इसके अलावा जब आप यह सुझाव देते हैं कि चेतावनी जोड़ना सुनिश्चित करें क्योंकि यह बचत नहीं है!
एंड्रे कूल

4

ठीक है, लेकिन आप पूरे रीयलटाइम डेटाबेस को खोलना नहीं चाहते हैं! आपको ऐसा कुछ चाहिए।

{
  /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
  "rules": {
    ".read": "auth.uid !=null",
    ".write": "auth.uid !=null"
  }
}

या

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

2

एक और समाधान वास्तव में उपयोगकर्ता को स्वचालित रूप से बनाना या लॉगिन करना है यदि आपके पास पहले से ही क्रेडेंशियल्स हैं। यहां बताया गया है कि मैं इसे प्लेन JS का उपयोग कैसे करता हूं।

function loginToFirebase(callback)
{
    let email = 'xx@xx.com';
    let password = 'xxxxxxxxxxxxxx';
    let config =
    {
        apiKey: "xxx",
        authDomain: "xxxxx.firebaseapp.com",
        projectId: "xxx-xxx",
        databaseURL: "https://xxx-xxx.firebaseio.com",
        storageBucket: "gs://xx-xx.appspot.com",
    };

    if (!firebase.apps.length)
    {
        firebase.initializeApp(config);
    }

    let database = firebase.database();
    let storage = firebase.storage();

    loginFirebaseUser(email, password, callback);
}

function loginFirebaseUser(email, password, callback)
{
    console.log('Logging in Firebase User');

    firebase.auth().signInWithEmailAndPassword(email, password)
        .then(function ()
        {
            if (callback)
            {
                callback();
            }
        })
        .catch(function(login_error)
        {
            let loginErrorCode = login_error.code;
            let loginErrorMessage = login_error.message;

            console.log(loginErrorCode);
            console.log(loginErrorMessage);

            if (loginErrorCode === 'auth/user-not-found')
            {
                createFirebaseUser(email, password, callback)
            }
        });
}

function createFirebaseUser(email, password, callback)
{
    console.log('Creating Firebase User');

    firebase.auth().createUserWithEmailAndPassword(email, password)
        .then(function ()
        {
            if (callback)
            {
                callback();
            }
        })
        .catch(function(create_error)
        {
            let createErrorCode = create_error.code;
            let createErrorMessage = create_error.message;

            console.log(createErrorCode);
            console.log(createErrorMessage);
        });
}

यह वास्तव में खराब सुरक्षा वार है।
एएसएच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.