Firebase-Berechtigung verweigert

123

Ich bin relativ neu im Codieren und habe Probleme.

Ich habe diesen Code, um Daten an Firebase zu senden

app.userid = app.user.uid

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

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

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

Ich erhalte jedoch immer wieder den Fehler:

FIREBASE WARNING: Set at / users / (GoogleID) fehlgeschlagen: erlaubnis_denied 2016-05-23 22: 52: 42.707 firebase.js: 227 Nicht gefangen (im Versprechen) Fehler: PERMISSION_DENIED: Erlaubnis verweigert (…)

Wenn ich versuche, dies nachzuschlagen, geht es um Regeln für Firebase, die in einer Sprache zu sein scheinen, die ich noch nicht gelernt habe (oder die mir nur über den Kopf geht). Kann jemand erklären, was das Problem verursacht? Ich dachte, ich hätte darum gebeten, E-Mail und den Anzeigenamen des Benutzers zu speichern, und Sie durften dies einfach nicht tun, aber als ich diese herausnahm, hatte ich immer noch das gleiche Problem. Gibt es eine Möglichkeit, diesen Fehler zu vermeiden, ohne die Regeln festzulegen, oder kann ich mir selbst beibringen, wie man an einem Tag schreibt, oder bin ich einfach weit außerhalb meiner Liga?

Vielen Dank für jede Hilfe!

Robert Prine
quelle

Antworten:

250

Standardmäßig ist die Datenbank in einem Projekt in der Firebase-Konsole nur für Administratoren lesbar / beschreibbar (z. B. in Cloud-Funktionen oder Prozessen, die ein Admin-SDK verwenden). Benutzer der regulären clientseitigen SDKs können nur dann auf die Datenbank zugreifen, wenn Sie die serverseitigen Sicherheitsregeln ändern.


Sie können die Regeln so ändern, dass die Datenbank nur von authentifizierten Benutzern gelesen / beschrieben werden kann:

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

Informationen zu den Sicherheitsregeln für die Firebase-Datenbank finden Sie im Schnellstart .

Da Sie den Benutzer jedoch nicht über Ihren Code anmelden, verweigert Ihnen die Datenbank den Zugriff auf die Daten. Um dies zu beheben, müssen Sie entweder nicht authentifizierten Zugriff auf Ihre Datenbank zulassen oder den Benutzer anmelden, bevor Sie auf die Datenbank zugreifen.

Erlauben Sie nicht authentifizierten Zugriff auf Ihre Datenbank

Die derzeit einfachste Problemumgehung (bis das Lernprogramm aktualisiert wird) besteht darin, das Datenbankfenster in der Konsole für Ihr Projekt aufzurufen, die Registerkarte Regeln auszuwählen und den Inhalt durch die folgenden Regeln zu ersetzen:

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

Dadurch kann Ihre neue Datenbank von jedem gelesen und beschrieben werden, der die URL der Datenbank kennt. Stellen Sie sicher, dass Sie Ihre Datenbank erneut sichern, bevor Sie mit der Produktion beginnen. Andernfalls wird sie wahrscheinlich von jemandem missbraucht.

Melden Sie sich beim Benutzer an, bevor Sie auf die Datenbank zugreifen

Rufen Sie für eine (etwas) zeitaufwändigere, aber sicherere Lösung eine der signIn...Methoden der Firebase-Authentifizierung auf, um sicherzustellen, dass der Benutzer angemeldet ist, bevor Sie auf die Datenbank zugreifen. Der einfachste Weg, dies zu tun, ist die anonyme Authentifizierung :

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

Fügen Sie dann Ihre Listener hinzu, wenn die Anmeldung erkannt wird

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.
    // ...
  }
  // ...
});
Frank van Puffelen
quelle
1
Vielen Dank - Sie haben den unsicheren Fix verwendet und Ihre Antwort in einer Antwort auf eine ähnliche Frage zitiert, um in diesem Ember-Tutorial über Probleme mit Firebase-Berechtigungen hinauszugehen . Aber wo fügen wir den (sicheren) anonymen Authentifizierungscode hinzu?
Dave Everitt
2
OMG da geht eine Stunde. Ich hatte das da drin, aber die Werte waren FALSCH ... Ich habe es einfach übersehen. Geändert sie in TRUE und bam, App funktioniert wie Sie denken ...
Andy
OMG, ich auch, konnte nicht herausfinden, warum sie bei Berechtigungen fehlgeschlagen sind, als beide bereits auf false gesetzt waren (bis ich Ihren Kommentar gelesen habe). duh, noob Fehler., sie sollten beide wahr sein, wenn Sie es für die Öffentlichkeit zugänglich machen (liest). Vielen Dank, dass Sie auf Ihren eigenen Fehler hingewiesen haben. Sie haben mir geholfen, ihn herauszufinden. Für die Aufzeichnung habe ich meine Regel in folgende geändert: ".read": true und dann hat es angefangen zu funktionieren.
Auftragnehmerwolf
@Andy Danke Mann, das gleiche gilt für mich und als ich sah, dass dein Kommentar mein Problem gelöst hat;)
Mahmudul Hasan Sohag
86

Ich hatte ein ähnliches Problem und stellte fest, dass dieser Fehler auf falsche Regeln für Lese- / Schreibvorgänge für Echtzeitdatenbanken zurückzuführen war. Standardmäßig lädt Google Firebase heutzutage Cloud-Speicher nicht Echtzeit-Datenbank. Wir müssen auf Echtzeit umstellen und die richtigen Regeln anwenden.

Geben Sie hier die Bildbeschreibung ein

Wie wir sehen können, heißt es, dass Cloud Firestore keine Echtzeitdatenbank ist. Sobald auf die richtige Datenbank umgestellt wurde, gelten die folgenden Regeln:

{
   "rules": {
       ".read": true,
       ".write": true
     }
 }
Sei einfach komisch
quelle
3
Verdammte Benutzeroberfläche! Ich habe den ganzen Tag damit verbracht herauszufinden, warum ich andere Regeln habe ... Ah ... Es war für "Cloud Firestore" ... Danke!
Alexey Volodko
43

Gehen Sie zur von Ihnen erwähnten Option "Datenbank".

  1. Dort im blauen Header finden Sie eine Dropdown-Liste mit der Aufschrift Cloud Firestore Beta
  2. Ändern Sie es in "Echtzeitdatenbank"
  3. Gehen Sie zu Regeln und setzen Sie .write .read beide auf true

Von hier kopiert .

Ahmed Adewale
quelle
11

Gehen Sie zur Datenbank, neben dem Titel gibt es 2 Optionen:

Cloud Firestore, Echtzeitdatenbank

Wählen Sie Echtzeitdatenbank und gehen Sie zu Regeln

Ändern Sie die Regeln in true.

Dies löste mein Problem.

Jaywant Narwade
quelle
4
  1. Öffnen Sie die Firebase und wählen Sie die Datenbank auf der linken Seite aus.
  2. Wählen Sie nun auf der rechten Seite [Echtzeitdatenbank] aus der Dropdown-Liste aus und ändern Sie die Regeln in: {"Regeln": {".read": true, ".write": true}}

Es klappt..!!

Anindya Sankar Dasgupta
quelle
5
Dies wurde bereits in der anderen Antwort gesagt. Auch wenn Sie dies vorschlagen, stellen Sie sicher, dass Sie eine Warnung hinzufügen, da dies nicht gespeichert ist!
André Kool
4

OK, aber Sie möchten nicht die gesamte Echtzeitdatenbank öffnen! Du brauchst so etwas.

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

oder

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}
Ondřej Bauer
quelle
2

Eine andere Lösung besteht darin, den Benutzer tatsächlich automatisch zu erstellen oder anzumelden, wenn Sie die Anmeldeinformationen bereits zur Hand haben. Hier ist, wie ich es mit Plain JS mache.

function loginToFirebase(callback)
{
    let email = '[email protected]';
    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);
        });
}
Parampal Pooni
quelle
Das ist wirklich schlecht in Bezug auf die Sicherheit.
ASH