firestore: PERMISSION_DENIED: permisos faltantes o insuficientes

118

Estoy recibiendo el error

getdocuments.com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Permisos faltantes o insuficientes.

para el siguiente código en la declaración 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
fuente
¿El usuario ha iniciado sesión?
Suhayl SH
4
¿Ha establecido las reglas en la pestaña Seguridad en Firebase Console?
Suhayl SH
1
Mi error, no vi el cuadro desplegable del almacén de incendios en la nube. Solo estaba comprobando la base de datos en tiempo real.
S Rekhu
gracias @SuhaylSH
S Rekhu

Respuestas:

172

Simplemente funciona para mí.

Vaya a Base de datos -> Reglas ->

Cambiar allow read, write: if falso; a verdadero;

Nota: ¡Esto desactiva completamente la seguridad de la base de datos!

¡¡Haciendo que todo el mundo pueda escribir sin autenticación !!! Esta NO es una solución recomendada para un entorno de producción. Úselo solo para fines de prueba.

Luvnish Monga
fuente
44
tenga en cuenta que permite que todos lean y escriban su base de datos sin autorización.
Sai Gopi Me
104
Esta es una solución horrible, esto literalmente solo desactiva la seguridad. Ve a leer esto en su lugar: firebase.google.com/docs/firestore/security/get-started
Duncan Luk
2
@ojonugwaochalifu porque esto funciona para todos
Luvnish Monga
11
Como dijo @DuncanLuk, es una solución terrible. Ni siquiera lo llamaría una solución
Ojonugwa Jude Ochalifu
6
La mejor solución para empezar muy rápido. Los problemas de seguridad podrían solucionarse más adelante.
Viacheslav Dobromyslov
79

Vaya a Base de datos -> Reglas :

Luego cambió debajo de las reglas

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

a continuación

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}
Md Nakibul Hassan
fuente
9
Esta es una mala idea, esto hace que TODOS los documentos puedan ser escribidos por CUALQUIER usuario autenticado, incluso cosas que pertenecen a otros usuarios, cosas que solo deben ser grabadas por el administrador o que nunca se pueden escribir en absoluto. Conserve la primera parte del código, ya que es una protección contra las reglas de seguridad no implementadas.
Noxxys
1
Tenga en cuenta que si permite que las personas se registren (con Google SSO, por ejemplo), automáticamente tendrán acceso a todos sus datos.
ForrestLyman
2
Quiero permitir que mis usuarios autenticados (un pequeño número) accedan a todos los documentos, por lo que esta receta es perfecta para mi caso.
AFD
1
Esta debería ser la respuesta aceptada.
Ishaan
19

Entonces, en mi caso, tenía las siguientes reglas de base de datos:

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

Como puede ver, hay un uidcampo en el storydocumento para marcar al propietario.

Luego, en mi código, estaba consultando todas las historias (Flutter):

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

Y falló porque ya agregué algunas historias a través de diferentes usuarios. Para solucionarlo, debe agregar una condición a la consulta:

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

Más detalles aquí: https://firebase.google.com/docs/firestore/security/rules-query

EDITAR: desde el enlace

Las reglas no son filtros Al escribir consultas para recuperar documentos, tenga en cuenta que las reglas de seguridad no son filtros; las consultas son todo o nada. Para ahorrarle tiempo y recursos, Cloud Firestore evalúa una consulta con su conjunto de resultados potencial en lugar de los valores de campo reales para todos sus documentos. Si una consulta podría devolver documentos que el cliente no tiene permiso para leer, toda la solicitud falla.

rwozniak
fuente
¿Qué es el objeto de usuario?
Phani Rithvij
Esta es la mejor respuesta
Elia Weiss
12

Las respuestas votadas anteriormente son peligrosas para la salud de su base de datos. Aún puede hacer que su base de datos esté disponible solo para leer y no para escribir:

  service cloud.firestore {
    match /databases/{database}/documents {
     match /{document=**} {
       allow read: if true;
       allow write: if false;
      }
   }
}
Ssubrat Rrudra
fuente
1
¿Cuál es la forma correcta de habilitar los permisos, pero no para todos?
nyxee
8

Si lo intenta en la aplicación Java Swing.

  1. Ir a la Firebase Console> Project Overview>Project Settings

  2. Luego vaya a la pestaña Cuentas de servicio y luego haga clic en Generar nueva clave privada.

  3. Obtendrá un archivo .json, colóquelo en una ruta conocida

  4. Luego, vaya a Propiedades de Mi PC, Configuración avanzada del sistema, Variables de entorno.

  5. Cree un nuevo GOOGLE_APPLICATION_CREDENTIALSvalor de variable de ruta con su ruta al archivo json.

Nadun Liyanage
fuente
Este también fue mi problema, hay información para esto en los documentos .
tris timb
5

npm i --save firebase @ angular / fire

en app.module asegúrese de haber importado

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

en importaciones

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

en las reglas de la base de datos en tiempo real, asegúrese de tener

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

en las reglas de Cloud Firestore, asegúrese de tener

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

asegúrese de que su base de datos no esté vacía ni que su consulta sea para una colección que no existe

itzhar
fuente
8
Esta excepción no tiene nada que ver con la colección vacía o la base de datos, es un problema de permiso
Ojonugwa Jude Ochalifu
Esta excepción no tiene nada que ver con Db vacío, etc. Problema con las reglas de seguridad y Auth.
Rehan Ali
Yo y al menos otras 3 personas tenemos esta excepción en este escenario. Si no le ayuda, pase a la siguiente solución
itzhar
3

Además, puede obtener este error si la referencia de la colección de su código no coincide con el nombre de la colección en firebase.

Por ejemplo, el nombre de la colección en firebase es users, pero la referencia con db.collection("Users")odb.collection("user")

También distingue entre mayúsculas y minúsculas.

Espero que esto ayude a alguien

Anga
fuente
¿No se crea la colección implícitamente? En su ejemplo, la colección "Usuarios" y "usuario" se crearía cuando se hace referencia a ella.
bdev TJ
Puede encontrar información aquí. codelabs.developers.google.com/codelabs/firestore-android/#3
bdev TJ
@DevTJ tiene razón cuando es una solicitud addo set, pero de la pregunta es una getsolicitud. He experimentado esto antes
Anga
2

Si alguien aterriza aquí intentando acceder a Firestore con una cuenta de servicio:

Resolví este problema otorgando a la cuenta de servicio el Service Account Userrol además del Cloud Datastore Userrol en la configuración de IAM de GCP.

maxarndt
fuente
2

En este momento, junio de 2020, de forma predeterminada, la base de fuego está definida por tiempo. Defina el tiempo para satisfacer sus necesidades.

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

Tenga en cuenta: su base de datos todavía está abierta para cualquiera. Le sugiero que lea la documentación y configure la base de datos de la forma que le resulte útil.

Richardd
fuente
1

el problema es que intentó leer o escribir datos en la base de datos en tiempo real o en el almacén de incendios antes de que el usuario se haya autenticado. Intente comprobar el alcance de su código. espero que haya ayudado!

dova dominique kabengela
fuente
1

Tuve este error con Firebase Admin, la solución fue configurar Firebase Admin correctamente siguiendo este enlace

DigaoParceiro
fuente
1

Para mí fue el problema de la fecha. Se actualizó y se resolvió el problema.

Permitir lectura / escritura:

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

Editar: si aún está confundido y no puede averiguar cuál es el problema, solo eche un vistazo a la sección de reglas en su consola de base de fuego.

Wakas Abbasid
fuente
1

el límite de tiempo puede haber terminado

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

hay fecha de cambio para hoy en esta línea:

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

Sus reglas deberían ser así para este caso, sin embargo, el mensaje dice que no es la forma sugerida, pero si hace esto, puede hacer inserciones sin error de permiso.

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