Firebase身份验证正在运行,但Firestore拒绝请求为缺少权限或权限不足

时间:2020-09-07 04:12:27

标签: android firebase google-cloud-firestore firebase-security

最近几个月我正在运行一个android应用。昨天我升级到了Blaze计划,从那时起,Firestore开始拒绝出现以下错误的请求(不确定这两个是否相关,并且我的配额远低于配额)

PERMISSION_DENIED:缺少权限或权限不足。

以下是我的安全规则

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

Firebase身份验证在我使用时工作正常

fbUser = firebaseAuth.getCurrentUser();

,我正在获取fbUser。但是我的Android应用对Firestore的任何请求都被拒绝。以下是堆栈跟踪

com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Missing or insufficient permissions.
    at com.google.firebase.firestore.util.Util.exceptionFromStatus(com.google.firebase:firebase-firestore@@21.4.3:117)
    at com.google.firebase.firestore.core.EventManager.onError(com.google.firebase:firebase-firestore@@21.4.3:166)
    at com.google.firebase.firestore.core.SyncEngine.removeAndCleanupTarget(com.google.firebase:firebase-firestore@@21.4.3:534)
    at com.google.firebase.firestore.core.SyncEngine.handleRejectedListen(com.google.firebase:firebase-firestore@@21.4.3:418)
    at com.google.firebase.firestore.core.FirestoreClient.handleRejectedListen(com.google.firebase:firebase-firestore@@21.4.3:317)
    at com.google.firebase.firestore.remote.RemoteStore.processTargetError(com.google.firebase:firebase-firestore@@21.4.3:557)
    at com.google.firebase.firestore.remote.RemoteStore.handleWatchChange(com.google.firebase:firebase-firestore@@21.4.3:441)
    at com.google.firebase.firestore.remote.RemoteStore.access$100(com.google.firebase:firebase-firestore@@21.4.3:53)
    at com.google.firebase.firestore.remote.RemoteStore$1.onWatchChange(com.google.firebase:firebase-firestore@@21.4.3:176)
    at com.google.firebase.firestore.remote.WatchStream.onNext(com.google.firebase:firebase-firestore@@21.4.3:108)
    at com.google.firebase.firestore.remote.WatchStream.onNext(com.google.firebase:firebase-firestore@@21.4.3:38)
    at com.google.firebase.firestore.remote.AbstractStream$StreamObserver.lambda$onNext$1(com.google.firebase:firebase-firestore@@21.4.3:119)
    at com.google.firebase.firestore.remote.AbstractStream$StreamObserver$$Lambda$2.run(Unknown Source:4)
    at com.google.firebase.firestore.remote.AbstractStream$CloseGuardedRunner.run(com.google.firebase:firebase-firestore@@21.4.3:67)
    at com.google.firebase.firestore.remote.AbstractStream$StreamObserver.onNext(com.google.firebase:firebase-firestore@@21.4.3:110)
    at com.google.firebase.firestore.remote.FirestoreChannel$1.onMessage(com.google.firebase:firebase-firestore@@21.4.3:124)
    at io.grpc.ForwardingClientCallListener.onMessage(ForwardingClientCallListener.java:33)
    at io.grpc.ForwardingClientCallListener.onMessage(ForwardingClientCallListener.java:33)
    at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInContext(ClientCallImpl.java:563)
    at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37)
    at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:123)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at com.google.firebase.firestore.util.AsyncQueue$SynchronizedShutdownAwareExecutor$DelayedStartFactory.run(com.google.firebase:firebase-firestore@@21.4.3:229)
    at java.lang.Thread.run(Thread.java:919)
Caused by: io.grpc.StatusException: PERMISSION_DENIED: Missing or insufficient permissions.
    at io.grpc.Status.asException(Status.java:541)
    at com.google.firebase.firestore.util.Util.exceptionFromStatus(com.google.firebase:firebase-firestore@@21.4.3:115)
    ... 27 more

2 个答案:

答案 0 :(得分:0)

计费计划和安全规则无关。

您的规则拒绝在没有用户登录的情况下发生的任何请求。为了使查询正常工作,这是唯一需要满足的事情。这里没有足够的信息来知道为什么用户未登录(如果这就是您所期望的),但是根据您在此处显示的内容,这就是“拒绝权限”的唯一原因。您必须进行一些调试才能找出答案。

答案 1 :(得分:0)

这不是一个完整的解决方案,而是朝着一个方向迈出的一步。

我在示例应用程序留言簿 link 中遇到了完全相同的问题。

一个修复是我从头开始创建了一个新的 firebase 项目...它起作用了...(源代码是相同的,除了一个文件中的项目 ID)。 与旧的非工作项目相同的安全规则..对我来说,原始问题不在于安全规则。

那么问题是配置有什么不同? 我能想象的唯一区别是服务帐户的配置......“角色”是否起作用?如果是,以什么方式?

我注意到的一件事是在 firebase 控制台中,服务帐户基于“firebase-adminsdk-rk0ap”......而不是“firebase-service-account”服务帐户。对于旧项目,两者都不起作用。 对于新项目,我使用了“firebase-adminsdk-xxxx”帐户

在控制台重新初始化也不起作用(GuestBook 示例中的步骤):

gcloud auth login
gcloud init (reinitialized current project)
gcloud app create  (wasn't necessary, because already activated).

第一次调用浏览器时的一个错误(不知道是否相关)是:

WARNING: Failed to find a usable hardware address from the network interfaces; using random bytes: 94:a0:2d:dd:19:25:bf:f2
com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Missing or insufficient permissions.

然后当应用程序尝试访问/写入数据存储时:

"POST /sign HTTP/1.1" 302
"GET /index.jsp?guestbookName=default HTTP/1.1" 200
com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: Missing or insufficient permissions.

(我本来想把它放在评论中,但我没有权限)。