firestore: PERMISSION_DENIED: autorizzazioni mancanti o insufficienti


117

Ricevo l'errore

gettingdocuments.com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: autorizzazioni mancanti o insufficienti.

per il codice seguente sull'istruzione else

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());
             }
         }
     });

L'utente ha effettuato l'accesso?
Suhayl SH

4
Hai impostato le regole nella scheda Sicurezza in Firebase Console?
Suhayl SH

1
Errore mio, non ho visto la casella per il cloud firestore. Stavo controllando solo il database in tempo reale.
S Rekhu

grazie @SuhaylSH
S Rekhu

Risposte:


171

Funziona semplicemente per me.

Vai in Database -> Regole ->

Cambia allow read, write: if falso; al vero;

Nota: questo disattiva completamente la sicurezza per il database!

Rendendolo scrivibile in tutto il mondo senza autenticazione !!! Questa NON è una soluzione da consigliare per un ambiente di produzione. Usalo solo a scopo di test.


44
nota che permette a tutti di leggere, scrivere il tuo database senza alcuna autorizzazione.
Sai Gopi Me

104
Questa è una soluzione orribile, questo disabilita letteralmente la sicurezza. Vai a leggere invece: firebase.google.com/docs/firestore/security/get-started
Duncan Luk

2
@ojonugwaochalifu perché funziona per tutti
Luvnish Monga

11
Come ha detto @DuncanLuk, è una soluzione terribile. Non la definirei nemmeno una soluzione
Ojonugwa Jude Ochalifu

6
La migliore soluzione per iniziare molto velocemente. I problemi di sicurezza potrebbero essere risolti in seguito.
Viacheslav Dobromyslov

79

Vai a Database -> Regole :

Poi cambiato sotto le regole

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

in basso

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

9
Questa è una cattiva idea, questo rende TUTTI i documenti scrivibili da QUALSIASI utente autenticato, anche cose che appartengono ad altri utenti, cose che dovrebbero essere scrivibili solo dall'amministratore o non essere mai state scrivibili affatto. Si prega di conservare la prima parte di codice in quanto protegge dalle regole di sicurezza non implementate.
Noxxys

1
Tieni presente che se consenti alle persone di registrarsi (ad esempio con Google SSO) avranno automaticamente accesso a tutti i tuoi dati.
ForrestLyman

2
Voglio consentire ai miei utenti autenticati (un piccolo numero) di accedere a tutti i documenti, quindi questa ricetta è perfetta per il mio caso.
AFD

1
Questa dovrebbe essere la risposta accettata.
Ishaan

19

Quindi nel mio caso avevo le seguenti regole DB:

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
    }
  }
}

Come puoi vedere c'è un uidcampo sul storydocumento per contrassegnare il proprietario.

Quindi nel mio codice stavo interrogando tutte le storie (Flutter):

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

Ed è fallito perché ho già aggiunto alcune storie tramite diversi utenti. Per risolverlo è necessario aggiungere una condizione alla query:

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

Maggiori dettagli qui: https://firebase.google.com/docs/firestore/security/rules-query

EDIT: dal link

Le regole non sono filtri Quando si scrivono query per recuperare documenti, tenere presente che le regole di sicurezza non sono filtri: le query sono tutto o niente. Per farti risparmiare tempo e risorse, Cloud Firestore valuta una query rispetto al suo potenziale set di risultati invece dei valori effettivi dei campi per tutti i tuoi documenti. Se una query potrebbe potenzialmente restituire documenti che il client non è autorizzato a leggere, l'intera richiesta non riesce.


qual è l'oggetto utente?
Phani Rithvij

Questa è la risposta migliore
Elia Weiss

12

Le risposte sopra votate sono pericolose per la salute del tuo database. Puoi comunque rendere il tuo database disponibile solo per la lettura e non per la scrittura:

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

1
qual è il modo corretto di abilitare le autorizzazioni, ma non per tutti?
nyxee

8

Se provi in ​​Java Swing Application.

  1. Vai a Firebase Console> Project Overview>Project Settings

  2. Quindi vai alla scheda Account di servizio e quindi fai clic su Genera nuova chiave privata.

  3. Otterrai un file .json, posizionalo in un percorso noto

  4. Quindi vai a Proprietà del computer, Impostazioni di sistema avanzate, Variabili d'ambiente.

  5. Crea un nuovo GOOGLE_APPLICATION_CREDENTIALSvalore variabile di percorso con il percorso del file json.


Questo era anche il mio problema, ci sono informazioni per questo sui documenti .
tris timb

5

npm i --save firebase @ angular / fire

in app.module assicurati di aver importato

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

nelle importazioni

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

nelle regole del database in tempo reale assicurati di avere

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

nelle regole di cloud firestore assicurati di avere

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

3

assicurati che il tuo DB non sia vuoto e che la tua richiesta sia per la raccolta che non esiste


8
Questa eccezione non ha nulla a che fare con la raccolta vuota o il db, è un problema di autorizzazione
Ojonugwa Jude Ochalifu

Questa eccezione non ha nulla a che fare con Db vuoto ecc. Problema con le regole di sicurezza e Auth.
Rehan Ali

Io e almeno altri 3 abbiamo questa eccezione in questo scenario. Se non ti aiuta, passa alla soluzione successiva
itzhar

3

Inoltre, potresti ricevere questo errore se il riferimento alla raccolta dal codice non corrisponde al nome della raccolta su Firebase.

Ad esempio, il nome della raccolta su Firebase è users, ma fai riferimento ad esso con db.collection("Users")odb.collection("user")

È anche sensibile al maiuscolo / minuscolo.

Spero che questo aiuti qualcuno


La collezione non è stata creata implicitamente? Nel tuo esempio, le raccolte "Users" e "user" vengono create come e quando viene fatto riferimento.
bdev TJ

Le informazioni possono essere trovate qui. codelabs.developers.google.com/codelabs/firestore-android/#3
bdev TJ

@DevTJ hai ragione quando è una richiesta addo set, ma dalla domanda è una getrichiesta. L'ho già sperimentato prima
Anga


2

Se qualcuno atterra qui cercando di accedere a Firestore con un account di servizio:

Ho risolto questo problema concedendo all'account di servizio il Service Account Userruolo oltre al Cloud Datastore Userruolo nelle impostazioni IAM di GCP.


2

In questo momento, giugno 2020, per impostazione predefinita la base di fuoco è definita in base al tempo. Definisci il tempo per soddisfare le tue esigenze.

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

Nota: il tuo DB è ancora aperto a chiunque. Suggerisco di leggere la documentazione e configurare il DB nel modo che è utile per voi.


1

il problema è che hai provato a leggere o scrivere dati nel database in tempo reale o nel firestore prima che l'utente fosse autenticato. prova a controllare l'ambito del tuo codice. spero che abbia aiutato!



1

Per me era il problema con la data. Aggiornato e il problema è stato risolto.

Consenti lettura / scrittura:

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

Modifica: se sei ancora confuso e non riesci a capire qual è il problema, dai un'occhiata alla sezione delle regole nella tua console Firebase.


1

il limite di tempo potrebbe essere scaduto

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);
    }
  }
}

la data di cambio per oggi in questa riga:

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


-1

Le tue regole dovrebbero essere così per questo caso, tuttavia il messaggio dice che non è il modo suggerito, ma se lo fai puoi eseguire inserimenti senza errori di autorizzazione

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}
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.