我得到了错误

gettingdocuments.com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED:缺少或权限不足。

对于下面关于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());
             }
         }
     });

当前回答

经过批准的答案是非常危险的,因为任何人都可以在没有任何许可的情况下读取或写入您的数据库。我建议用这个。

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

这将允许授权人员写入数据库,而任何人都可以读取数据库,以防访问者访问网站。

其他回答

有很多很好的答案,但由于这是Firestore许可拒绝错误的顶级谷歌响应,我想我应该为初学者和新手添加一个答案。

为什么要设置安全规则?

如果您编写自己的后端,您将让用户向服务器请求一些东西,服务器将决定允许他们做什么。例如,您的服务器不允许user1删除user2的所有数据。

但是由于你的用户直接与Firebase交互,你不能真正信任你的用户发送给你的任何东西。例如,User1可以将删除请求中的用户id更改为'user2'。

Firestore安全规则是你告诉Firestore即你的后端服务器,谁被允许读取和写入什么数据。

Firestore团队的这个视频非常有用。

https://www.youtube.com/watch?v=eW5MdE3ZcAw

如果你遇到“权限缺失或权限不足”的错误,我强烈建议你在尝试其他任何东西之前观看完整的22分钟视频。

我从1/10到7/10理解了安全规则是如何工作的,以及为什么我只从这个视频中得到了错误。

入门指南也很有用,可以帮助回答视频中没有涵盖的问题。https://firebase.google.com/docs/firestore/security/get-started

另一个原因是AppCheck。我在一个新项目上启用了它(创建~ 2022年5月),但还没有完成集成步骤,导致“缺少或权限不足”错误。

要解决此问题,首先完成Firebase中AppCheck部分中列出的AppCheck设置步骤。我在我的web应用程序中使用了ReCAPTCHA提供者,你需要复制ReCAPTCHA公钥来在你的代码库中使用。

接下来,在你初始化firebase应用的任何地方添加AppCheck初始化代码。我的在React中是这样的:

  import { initializeAppCheck, ReCaptchaV3Provider } from 'firebase/app-check';

  // ......

  // Initialize Firebase
  const app = initializeApp(firebaseConfig);
  const analytics = getAnalytics(app);

  self['FIREBASE_APPCHECK_DEBUG_TOKEN'] = true;
  // Pass your reCAPTCHA v3 site key (public key) to activate(). Make sure this
  // key is the counterpart to the secret key you set in the Firebase console.
  initializeAppCheck(app, {
    provider: new ReCaptchaV3Provider('PASTE KEY HERE'),

    // Optional argument. If true, the SDK automatically refreshes App Check
    // tokens as needed.
    isTokenAutoRefreshEnabled: true,
  });

注意FIREBASE_APPCHECK_DEBUG_TOKEN行在浏览器控制台中打印了一个调试令牌,你需要将它复制回AppCheck下的Firebase控制台中以完成设置,之后你可以注释/删除该行。

这解决了我的问题。

进一步的信息:

https://firebase.google.com/docs/app-check/web/recaptcha-provider https://firebase.google.com/docs/app-check/web/debug-provider?authuser=0&hl=en

此时,即2020年6月,默认情况下firebase是按时间定义的。 为满足自己的需要而安排好时间。

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

请注意:你的数据库仍然对任何人开放。我建议,请阅读文档并以对您有用的方式配置DB。

转到Apple Certificates, Identifiers & Profiles: 选择您的密钥上传firebase并进行检查: 访问DeviceCheck和apptest api以获取您关联的数据

在这里输入图像描述

以上投票的答案对数据库的健康是危险的。你仍然可以让你的数据库只用于读取而不用于写入:

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