firestore: PERMISSION_DENIED: Permissões ausentes ou insuficientes


117

Estou recebendo o erro

gettingdocuments.com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Permissões ausentes ou insuficientes.

para o código abaixo na instrução 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());
             }
         }
     });

O usuário está logado?
Suhayl SH

4
Você definiu as regras na guia Segurança no Firebase console?
Suhayl SH

1
Erro meu, não vi a caixa de depósito para o firestore nuvem. Eu estava verificando apenas no banco de dados em tempo real.
S Rekhu

obrigado @SuhaylSH
S Rekhu

Respostas:


171

Simplesmente funciona para mim.

Vá em Banco de Dados -> Regras ->

Alterar allow read, write: if falso; para verdadeiro;

Nota: Isso desativa completamente a segurança do banco de dados!

Tornando mundialmente gravável sem autenticação !!! Esta NÃO é uma solução a ser recomendada para um ambiente de produção. Use isso apenas para fins de teste.


43
note que permite que qualquer pessoa leia e escreva em seu banco de dados sem qualquer autorização.
Sai Gopi Me

103
Esta é uma solução horrível, isso literalmente desabilita a segurança. Em vez disso, leia: firebase.google.com/docs/firestore/security/get-started
Duncan Luk

2
@ojonugwaochalifu porque está funcionando para todos
Luvnish Monga

11
Como @DuncanLuk disse, é uma solução terrível. Eu nem chamaria de solução
Ojonugwa Jude Ochalifu

6
Melhor solução para começar realmente rápido. As questões de segurança podem ser corrigidas mais tarde, na verdade.
Viacheslav Dobromyslov

79

Vá para Banco de Dados -> Regras :

Em seguida, alterou as regras abaixo

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

para baixo

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

9
Esta é uma má ideia, pois torna TODOS os documentos graváveis ​​por QUALQUER usuário autenticado, mesmo coisas que pertençam a outros usuários, coisas que só deveriam ser gravadas pelo administrador ou que nunca puderam ser gravadas. Guarde a primeira parte do código, pois ela é uma proteção contra regras de segurança não implementadas.
Noxxys

1
Observe que se você permitir que as pessoas se inscrevam (com o SSO do Google, por exemplo), elas terão acesso automático a todos os seus dados.
ForrestLyman

2
Quero permitir que meus usuários autenticados (um pequeno número) acessem todos os documentos, então esta receita é perfeita para o meu caso.
AFD

1
Esta deve ser a resposta aceita.
Ishaan

19

Portanto, no meu caso, eu tinha as seguintes regras de banco de dados:

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 você pode ver, existe um uidcampo no storydocumento para marcar o proprietário.

Então, em meu código, eu estava consultando todas as histórias (Flutter):

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

E falhou porque eu já adicionei algumas histórias de diferentes usuários. Para corrigi-lo, você precisa adicionar uma condição à consulta:

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

Mais detalhes aqui: https://firebase.google.com/docs/firestore/security/rules-query

EDIT: a partir do link

Regras não são filtros Ao escrever consultas para recuperar documentos, lembre-se de que as regras de segurança não são filtros - as consultas são tudo ou nada. Para economizar tempo e recursos, o Cloud Firestore avalia uma consulta em relação ao seu conjunto de resultados potencial, em vez dos valores de campo reais para todos os seus documentos. Se uma consulta puder retornar documentos que o cliente não tem permissão para ler, toda a solicitação falhará.


qual é o objeto do usuário?
Phani Rithvij

Esta é a melhor resposta
Elia Weiss

12

As respostas votadas acima são perigosas para a saúde do seu banco de dados. Você ainda pode disponibilizar seu banco de dados apenas para leitura e não para escrita:

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

1
qual é a maneira correta de habilitar as permissões, mas não para todos?
nyxee

8

Se você tentar no aplicativo Java Swing.

  1. Go To Firebase Console> Project Overview>Project Settings

  2. Em seguida, vá para a guia Contas de serviço e clique em Gerar nova chave privada.

  3. Você obterá um arquivo .json, coloque-o em um caminho conhecido

  4. Em seguida, vá para Propriedades do meu computador, Configurações avançadas do sistema, Variáveis ​​de ambiente.

  5. Crie um novo GOOGLE_APPLICATION_CREDENTIALSvalor de variável de caminho com seu caminho para o arquivo json.


Esse era o meu problema também, há informações sobre isso na documentação .
tris timb

5

npm i - salvar firebase @ angular / fire

em app.module certifique-se de importar

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

nas importações

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

em regras de banco de dados em tempo real, certifique-se de ter

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

nas regras do Cloud Firestore certifique-se de ter

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

3

certifique-se de que seu banco de dados não está vazio nem que sua consulta seja para coleções que não existem


8
Essa exceção não tem nada a ver com coleção vazia ou banco de dados, é um problema de permissão
Ojonugwa Jude Ochalifu

Esta exceção não tem nada a ver com Db vazio etc. Problema com regras de segurança e Auth.
Rehan Ali

Eu e pelo menos 3 outras pessoas temos essa exceção neste cenário. Se não ajudar você, vá para a próxima solução
itzhar

3

Além disso, você pode receber este erro se a referência da coleção do seu código não corresponder ao nome da coleção no firebase.

Por exemplo, o nome da coleção no firebase é users, mas sua referência a ele com db.collection("Users")oudb.collection("user")

É sensível a maiúsculas e minúsculas também.

Espero que isso ajude alguém


A coleção não é criada implicitamente? Em seu exemplo, a coleção "Usuários" e "usuário" seria criada conforme e quando fosse referenciada.
bdev TJ

Informações podem ser encontradas aqui. codelabs.developers.google.com/codelabs/firestore-android/#3
bdev TJ

@DevTJ você está correto quando é um pedido addou set, mas pela pergunta é um getpedido. Já experimentei isso antes
Anga


2

Se alguém chegar aqui tentando acessar o Firestore com uma conta de serviço:

Resolvi esse problema concedendo à conta de serviço a Service Account Userfunção, além da Cloud Datastore Userfunção nas configurações de IAM do GCP.


2

Neste momento, junho de 2020, por padrão, o firebase é definido por tempo. Defina o horário para atender às suas necessidades.

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

Observação: seu banco de dados ainda está aberto a todos. Eu sugiro, por favor, leia a documentação e configure o DB da maneira que for útil para você.


1

o problema é que você tentou ler ou gravar dados no banco de dados em tempo real ou no firestore antes de o usuário ser autenticado. tente verificar o escopo do seu código. espero que tenha ajudado!



1

Para mim, era o problema da data. Atualizou e o problema foi resolvido.

Permitir leitura / gravação:

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

Edit: Se você ainda está confuso e não consegue descobrir qual é o problema, basta dar uma olhada na seção de regras em seu console do Firebase.


1

limite de tempo pode ter acabado

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

mudança de data para hoje nesta linha:

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


-1

Suas regras devem ser assim para este caso porém a mensagem diz que não é a forma sugerida, mas se você fizer isso poderá fazer inserções sem erro de permissão

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.