Firestore: PERMISSION_DENIED: autorisations manquantes ou insuffisantes

119

J'obtiens l'erreur

gettingdocuments.com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: autorisations manquantes ou insuffisantes.

pour le code ci-dessous sur l'instruction 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());
             }
         }
     });
S Rekhu
la source
L'utilisateur est-il connecté?
Suhayl SH
4
Avez-vous défini les règles sous l'onglet Sécurité dans la console Firebase?
Suhayl SH
1
Mon erreur, je n'ai pas vu la boîte de dépôt pour le cloud firestore. Je vérifiais uniquement la base de données en temps réel.
S Rekhu
merci @SuhaylSH
S Rekhu

Réponses:

176

Cela fonctionne simplement pour moi.

Allez dans la base de données -> Règles ->

Changer allow read, write: if faux; à vrai;

Remarque: cela désactive complètement la sécurité de la base de données!

Rendre le monde inscriptible sans authentification !!! Ce n'est PAS une solution à recommander pour un environnement de production. Utilisez-le uniquement à des fins de test.

Luvnish Monga
la source
44
notez qu'il permet à tout le monde de lire, d'écrire votre base de données sans aucune autorisation.
Sai Gopi Me
105
C'est une solution horrible, cela désactive littéralement la sécurité. Allez plutôt lire ceci: firebase.google.com/docs/firestore/security/get-started
Duncan Luk
2
@ojonugwaochalifu parce que cela fonctionne pour tout le monde
Luvnish Monga
11
Comme @DuncanLuk l'a dit, c'est une solution terrible. Je n'appellerais même pas cela une solution
Ojonugwa Jude Ochalifu
6
La meilleure solution pour démarrer très rapidement. Les problèmes de sécurité pourraient être résolus ultérieurement.
Viacheslav Dobromyslov
79

Allez dans Base de données -> Règles :

Puis changé ci-dessous les règles

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

en dessous

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}
Md Nakibul Hassan
la source
9
C'est une mauvaise idée, cela rend TOUS les documents accessibles en écriture par N'IMPORTE QUEL utilisateur authentifié, même des éléments qui appartiennent à d'autres utilisateurs, des éléments qui ne devraient être accessibles en écriture que par l'administrateur ou qui ne devraient jamais l'être. Veuillez conserver le premier morceau de code car c'est une protection contre les règles de sécurité non appliquées.
Noxxys le
1
Notez que si vous autorisez les gens à s'inscrire (avec Google SSO par exemple), ils auront automatiquement accès à toutes vos données.
ForrestLyman
2
Je veux permettre à mes utilisateurs authentifiés (un petit nombre) d'accéder à tous les documents, donc cette recette est parfaite pour mon cas.
AFD
1
Cela devrait être la réponse acceptée.
Ishaan le
19

Donc, dans mon cas, j'avais les règles DB suivantes:

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

Comme vous pouvez le voir, il y a un uidchamp sur le storydocument pour marquer le propriétaire.

Ensuite, dans mon code, j'interrogeais toutes les histoires (Flutter):

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

Et cela a échoué car j'ai déjà ajouté des histoires via différents utilisateurs. Pour résoudre ce problème, vous devez ajouter une condition à la requête:

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

Plus de détails ici: https://firebase.google.com/docs/firestore/security/rules-query

EDIT: à partir du lien

Les règles ne sont pas des filtres Lorsque vous écrivez des requêtes pour récupérer des documents, gardez à l'esprit que les règles de sécurité ne sont pas des filtres - les requêtes sont tout ou rien. Pour vous faire gagner du temps et des ressources, Cloud Firestore évalue une requête par rapport à son ensemble de résultats potentiel au lieu des valeurs de champ réelles pour tous vos documents. Si une requête peut potentiellement renvoyer des documents que le client n'a pas l'autorisation de lire, la requête entière échoue.

rwozniak
la source
quel est l'objet utilisateur?
Phani Rithvij
C'est la meilleure réponse
Elia Weiss
12

Les réponses votées ci-dessus sont dangereuses pour la santé de votre base de données. Vous pouvez toujours rendre votre base de données disponible uniquement pour la lecture et non pour l'écriture:

  service cloud.firestore {
    match /databases/{database}/documents {
     match /{document=**} {
       allow read: if true;
       allow write: if false;
      }
   }
}
Ssubrat Rrudra
la source
1
quelle est la bonne façon d'activer les autorisations, mais pas pour tout le monde?
nyxee
8

Si vous essayez dans Java Swing Application.

  1. Aller à Firebase Console> Project Overview>Project Settings

  2. Ensuite, allez dans l'onglet Comptes de service, puis cliquez sur Générer une nouvelle clé privée.

  3. Vous obtiendrez un fichier .json, placez-le dans un chemin connu

  4. Ensuite, allez dans les propriétés de mon ordinateur, les paramètres système avancés, les variables d'environnement.

  5. Créez une nouvelle GOOGLE_APPLICATION_CREDENTIALSvaleur de variable de chemin avec votre chemin vers le fichier json.

Nadun Liyanage
la source
C'était aussi mon problème, il y a des informations à ce sujet sur la documentation .
tris timb
5

npm i --save firebase @ angular / fire

dans app.module, assurez-vous d'avoir importé

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

en importations

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

dans les règles de base de données en temps réel, assurez-vous d'avoir

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

dans les règles Cloud Firestore, assurez-vous d'avoir

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

assurez-vous que votre base de données n'est pas vide ni que votre requête concerne une collection qui n'existe pas

Itzhar
la source
9
Cette exception n'a rien à voir avec une collection vide ou une base de données, c'est un problème d'autorisation
Ojonugwa Jude Ochalifu
Cette exception n'a rien à voir avec une base de données vide, etc. Problème avec les règles de sécurité et l'authentification.
Rehan Ali
Moi et au moins 3 autres ont cette exception sur ce scénario. Si cela ne vous aide pas, passez à la solution suivante
itzhar
3

En outre, vous pouvez obtenir cette erreur si la référence de collection de votre code ne correspond pas au nom de la collection sur Firebase.

Par exemple, le nom de la collection sur Firebase est users, mais votre référence avec db.collection("Users")oudb.collection("user")

Il est également sensible à la casse.

J'espère que cela aide quelqu'un

Anga
la source
La collection n'est-elle pas créée implicitement? Dans votre exemple, la collection "Utilisateurs" et "Utilisateur" serait créée au fur et à mesure qu'elle est référencée.
bdev TJ
Des informations peuvent être trouvées ici. codelabs.developers.google.com/codelabs/firestore-android/#3
bdev TJ
@DevTJ vous avez raison quand c'est une demande addou set, mais à partir de la question, c'est une getdemande. J'ai déjà fait l'expérience de cela
Anga
2

Si quelqu'un atterrit ici pour essayer d'accéder à Firestore avec un compte de service:

J'ai résolu ce problème en accordant au compte de service le Service Account Userrôle en plus du Cloud Datastore Userrôle dans les paramètres IAM de GCP.

maxarndt
la source
2

En ce moment, juin 2020, par défaut, la base de feu est définie par l'heure. Définissez le temps pour répondre à vos besoins.

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

Attention: votre base de données est toujours ouverte à tous. Je suggère de lire la documentation et de configurer la base de données de la manière qui vous est utile.

Richardd
la source
1

le problème est que vous avez essayé de lire ou d'écrire des données dans la base de données en temps réel ou le firestore avant que l'utilisateur ne soit authentifié. veuillez essayer de vérifier la portée de votre code. espérons que cela a aidé!

dova dominique kabengela
la source
1

J'ai eu cette erreur avec Firebase Admin, la solution a été de configurer correctement Firebase Admin en suivant ce lien

DigaoParceiro
la source
1

Pour moi, c'était le problème de la date. Mis à jour et le problème a été résolu.

Autoriser la lecture / écriture:

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

Edit: Si vous êtes toujours confus et incapable de comprendre quel est le problème, jetez simplement un œil à la section des règles de votre console Firebase.

Wakas Abbasid
la source
1

le délai est peut-être dépassé

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

il y a changement de date pour aujourd'hui dans cette ligne:

 allow read, write: if request.time < timestamp.date(2020,7, 1);
Söhrab Vahidli
la source
0

Aller aux règles dans Firebase et modifier les règles ..... (fournir un horodatage ou définir à false) Ma solution.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.time < timestamp.date(2021, 8, 18);
    }
  }
}
Aditya Khatwa
la source
-1

Vos règles devraient être comme ça dans ce cas, mais le message indique que ce n'est pas la méthode suggérée, mais si vous faites cela, vous pouvez faire des insertions sans erreur d'autorisation

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}
Okan Serdaroğlu
la source