Autorizzazione Firebase negata


123

Sono relativamente nuovo alla programmazione e sto avendo problemi.

Ho questo codice per inviare i dati a Firebase

app.userid = app.user.uid

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

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

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

Tuttavia, continuo a ricevere l'errore:

AVVISO FIREBASE: impostato su / users / (GoogleID) non riuscito: permission_denied 2016-05-23 22: 52: 42.707 firebase.js: 227 Uncaught (in promessa) Errore: PERMISSION_DENIED: Permission denied (...)

Quando provo a cercarlo, parla delle regole per Firebase, che sembra essere in una lingua che non ho ancora imparato (o mi sta solo andando oltre la testa). Qualcuno può spiegare cosa sta causando il problema? Pensavo fosse che lo stavo chiedendo per memorizzare l'email e il nome visualizzato dell'utente e semplicemente non ti era permesso farlo, ma quando li ho tolti ho ancora avuto lo stesso problema. C'è un modo per evitare questo errore senza impostare le regole, o le regole sono qualcosa che posso insegnare a me stesso a scrivere in un giorno, o sono solo fuori dalla mia portata?

Grazie per qualsiasi aiuto!

Risposte:


250

Per impostazione predefinita, il database in un progetto nella console Firebase è leggibile / scrivibile solo da utenti amministrativi (ad esempio in Cloud Functions o processi che utilizzano un SDK di amministrazione). Gli utenti dei normali SDK lato client non possono accedere al database, a meno che non si modifichino le regole di sicurezza lato server.


È possibile modificare le regole in modo che il database sia leggibile / scrivibile solo da utenti autenticati:

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

Consulta la guida rapida per le regole di sicurezza del database Firebase .

Ma poiché non stai effettuando l'accesso dell'utente dal tuo codice, il database ti nega l'accesso ai dati. Per risolvere questo problema, dovrai consentire l'accesso non autenticato al tuo database o accedere all'utente prima di accedere al database.

Consenti l'accesso non autenticato al tuo database

La soluzione più semplice per il momento (fino a quando il tutorial non viene aggiornato) è andare nel pannello Database nella console per il tuo progetto, selezionare la scheda Regole e sostituire il contenuto con queste regole:

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

Ciò rende il tuo nuovo database leggibile e scrivibile da chiunque conosca l'URL del database. Assicurati di proteggere nuovamente il tuo database prima di entrare in produzione, altrimenti è probabile che qualcuno inizi ad abusarne.

Accedi l'utente prima di accedere al database

Per una soluzione (leggermente) più dispendiosa in termini di tempo, ma più sicura, chiama uno dei signIn...metodi di Firebase Authentication per assicurarti che l'utente abbia effettuato l'accesso prima di accedere al database. Il modo più semplice per farlo è utilizzare l'autenticazione anonima :

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

Quindi collega i tuoi ascoltatori quando viene rilevato l'accesso

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
Grazie: ho utilizzato la soluzione non sicura e ho citato la tua risposta in una risposta a una domanda simile per superare i problemi di autorizzazione di Firebase in questo tutorial di Ember . Ma dove aggiungiamo il codice di autenticazione anonimo (sicuro)?
Dave Everitt

2
OMG ci va un'ora. Avevo questo, ma i valori erano FALSI ... l'ho semplicemente trascurato. Li ho cambiati in TRUE e bam, l'app funziona come penseresti ...
Andy

OMG, anche io fn, non sono riuscito a capire perché stavano fallendo i permessi quando entrambi erano già impostati su false (fino a quando non ho letto il tuo commento). duh, errore noob., dovrebbero essere entrambi veri quando lo rendi aperto al pubblico (si legge). Grazie per aver sottolineato il tuo errore, mi hai aiutato a capirlo. Per la cronaca ho cambiato la mia regola in questa: ".read": true e poi ha iniziato a funzionare.
contractorwolf

@ Andy Grazie amico, lo stesso per me e vedere il tuo commento ha appena risolto il mio
problema

86

Stavo affrontando un problema simile e ho scoperto che questo errore era dovuto a regole errate impostate per le operazioni di lettura / scrittura per il database in tempo reale. Per impostazione predefinita, Google Firebase al giorno d'oggi carica il database del cloud store non in tempo reale. Dobbiamo passare al tempo reale e applicare le regole corrette.

inserisci qui la descrizione dell'immagine

Come possiamo vedere dice cloud Firestore non database in tempo reale, una volta passato al database corretto, applica le seguenti regole:

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

3
Dannazione UI! Ho passato l'intera giornata a capire perché ho regole diverse ... Ah ... Era per "cloud firestore" ... Grazie!
Alexey Volodko

43

Vai all'opzione "Database" che hai menzionato.

  1. Lì nell'intestazione blu troverai un menu a discesa che dice Cloud Firestore Beta
  2. Cambialo in "Database in tempo reale"
  3. Vai su Regole e imposta .write .read entrambi su true

Copiato da qui .


11

Vai al database, accanto al titolo ci sono 2 opzioni:

Cloud Firestore, database in tempo reale

Seleziona Database in tempo reale e vai alle regole

cambia le regole in true.

Questo ha risolto il mio problema.


4
  1. Apri Firebase, seleziona il database sul lato sinistro.
  2. Ora sul lato destro, seleziona [Database in tempo reale] dal menu a discesa e modifica le regole in: {"rules": {".read": true, ".write": true}}

Funziona..!!


5
Questo è già stato detto nell'altra risposta. Inoltre, quando lo suggerisci, assicurati di aggiungere un avviso perché non viene salvato!
André Kool

4

OK, ma non vuoi aprire l'intero database in tempo reale! Hai bisogno di qualcosa di simile.

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

o

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

1

Un'altra soluzione è creare effettivamente o accedere automaticamente all'utente se si hanno già le credenziali a portata di mano. Ecco come lo faccio usando Plain 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);
        });
}

Questo è davvero pessimo dal punto di vista della sicurezza.
ASH
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.