PERMISSION_DENIED:缺少或权限不足

我得到了错误

< p > 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());
}
}
});
381096 次浏览

进入数据库-> 规则→< / p >

发展:

allow read, write: if 虚假的;更改为真正的;

注意:它只是用于开发目的的快速解决方案,因为它将关闭所有安全性。因此,不建议在生产中使用。

生产:

如果从firebase验证:Change allow read, write: if 虚假的;请求。Auth != null;

确保你的数据库不是空的,你的查询是不存在的集合

此外,如果您的代码中的集合引用与firebase上的集合名称不匹配,则可能会出现此错误。

例如,firebase上的集合名称是users,但你用db.collection("Users")db.collection("user")引用它

它也是区分大小写的。

希望这对大家有所帮助

数据库 -> 规则:

然后更改如下规则

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

以下

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

所以在我的情况下,我有以下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
}
}
}

正如你所看到的,在story文档中有一个uid字段来标记所有者。

然后在我的代码中,我查询了所有的故事(Flutter):

Firestore.instance
.collection('stories')
.snapshots()
它失败了,因为我已经通过不同的用户添加了一些故事。 要解决这个问题,你需要在查询中添加条件:

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

更多细节:https://firebase.google.com/docs/firestore/security/rules-query

编辑:从链接

规则不是过滤器 在编写检索文档的查询时,请保持 请记住,安全规则不是过滤器—查询都是或 什么都没有。为了节省您的时间和资源,Cloud Firestore会评估一个 根据其潜在结果集而不是实际字段查询 所有文档的值。查询是否可能返回 客户端没有权限读取的文档,全部删除 请求失败。< / p >

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

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

如果你尝试在Java Swing应用程序。

  1. Firebase Console >Project Overview祝辞Project Settings

  2. 然后转到服务帐户选项卡,然后单击生成新的私钥。

  3. 你会得到一个.json文件,把它放在一个已知的路径中

  4. 然后进入我的计算机属性,高级系统设置,环境变量。

  5. 创建新的路径变量GOOGLE_APPLICATION_CREDENTIALS值,包含json文件的路径。

NPM I—save firebase @angular/fire

在app.module中确保你导入了

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

进口

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

在实时数据库规则中,确保你有

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

在云壁炉规则确保你有

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

检查服务帐户是否在IAM & Admin https://console.cloud.google.com/iam-admin/iam中添加了适当的角色,例如Editor

https://console.firebase.google.com

开发->数据库->规则->设置读、写-> true

enter image description here

enter image description here

问题是,您试图在用户身份验证之前读取或写入数据到实时数据库或firestore。请尝试检查代码的范围。 希望有帮助!< / p >

我有这个错误与Firebase管理员,解决方案是配置Firebase管理员正确点击这个链接

如果有人登陆这里试图使用服务帐户访问Firestore:

我通过在GCP的IAM设置中授予服务帐户Service Account User角色以及Cloud Datastore User角色来解决这个问题。

对我来说,是日期的问题。更新后问题已解决。

允许读/写:

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

编辑:如果您仍然感到困惑,无法找出问题所在,请查看firebase控制台的规则部分。

此时,2020年6月,默认情况下firebase由时间定义。

.定义时间来满足你的需要
allow read, write: if request.time < timestamp.date(2020, 7, 10);

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

时间限制可能已过

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

在这一行中有现在改日期:

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

进入firebase中的规则并编辑规则.....(提供时间戳或设置为false) 我的解决方案。< / p >

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

我也有“缺少或不充分的许可”;在指定安全规则后发生错误。事实证明,默认情况下规则是非递归 !例如,如果你写了一个规则

match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}

该规则将不适用于/users/{userId}下的任何子集合。这就是我犯错误的原因。

我通过指定规则来修复它:

match /users/{userId}/{document=**} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}

文件的相关部分上阅读更多。

转到firebase控制台=>云防火墙数据库,并添加规则,允许用户读写。

=比;允许读、写

进入Firestore的数据库>规则:

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

有关更多信息:https://firebase.google.com/docs/rules/rules-language?authuser=0

现在100%工作!😬

也许你该把日期去掉

rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if
request.time < timestamp.date(2021, 12, 12);
}
}
}

去苹果证书,标识符&配置文件: 选择您的密钥上传firebase并进行检查: 访问DeviceCheck和apptest api以获取您的关联

enter image description here

此处更改
设置false为true

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

并发布新的规则

enter image description here

我已经设法解决了我的问题。 我有2个错误:

  1. PERMISSION_DENIED:缺少或权限不足。
  2. 不能为此项目启用Firestore。

修复此问题的步骤:

第1部分。

  1. https://console.firebase.google.com/
  2. Firestore数据库->删除所有集合
  3. Firestore数据库->规则→删除所有规则历史记录

第2部分。

  1. https://console.cloud.google.com/
  2. 在菜单中找到:api &服务→启用的api &服务
  3. 禁用3个服务:“云Firestore API”,“Firebase规则API”,“Firebase API的云存储”
  4. 在菜单中找到:Firestore ->它将自动启用“云防火墙API”“Firebase规则API”服务,将创建Firestore数据库。
  5. 启用“Firebase API的云存储”。

最重要的是从谷歌云控制台创建一个Firestore数据库。

另一个原因是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控制台中以完成设置,之后你可以注释/删除该行。

这解决了我的问题。

进一步的信息:

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

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

为什么要设置安全规则?

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

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

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

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

enter image description here https://www.youtube.com/watch?v=eW5MdE3ZcAw < / p >

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

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

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

原始代码:

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

}
}
}

修改代码:

rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read: if true;
allow write: if request.auth != null;
}
}
}
对我来说,问题是AppCheck在我的Firestore控制台也被激活了。 所以我必须按照指南中所述的应用程序检查Flutter指南

https://firebase.google.com/docs/app-check/flutter/debug-provider?hl=it&authuser=0

打开androidDebugProvider: true,从控制台复制调试令牌并将其粘贴到Firestore部分(AppCheck—>应用程序——比;添加调试令牌),它立即工作。