我得到了错误
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());
}
}
});
所以在我的情况下,我有以下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
}
}
}
正如您所看到的,故事文档上有一个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会评估一个
根据其潜在结果集而不是实际字段查询
所有文档的值。查询是否可能返回
客户端没有权限读取的文档,全部删除
请求失败。
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;
}
}
}
时间限制可能已过
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);
在指定安全规则后,我还出现了“缺少或权限不足”错误。事实证明,默认情况下规则不是递归的!例如,如果你写了一个规则
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;
}
在文档的相关部分中阅读更多信息。
我已经设法解决了我的问题。
我有2个错误:
PERMISSION_DENIED:缺少或权限不足。
不能为此项目启用Firestore。
修复此问题的步骤:
第1部分。
访问https://console.firebase.google.com/
Firestore Database ->删除所有集合
Firestore Database -> Rules ->删除所有规则历史记录
第2部分。
访问https://console.cloud.google.com/
在菜单中找到:api和服务->已启用的api和服务
禁用3个服务:“云Firestore API”,“Firebase规则API”,“Firebase API的云存储”
Firestore ->将自动启用“云Firestore API”和“Firebase规则API”服务,并将创建Firestore数据库。
启用“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控制台中以完成设置,之后你可以注释/删除该行。
这解决了我的问题。
进一步的信息:
https://firebase.google.com/docs/app-check/web/recaptcha-provider
https://firebase.google.com/docs/app-check/web/debug-provider?authuser=0&hl=en
有很多很好的答案,但由于这是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