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

Posted

技术标签:

【中文标题】Firebase 身份验证正在运行,但 Firestore 以缺少权限或权限不足为由拒绝请求【英文标题】:Firebase authentication is working but firestore is denying request as Missing or Insufficient permissions 【发布时间】:2020-12-25 12:02:17 【问题描述】:

过去几个月我有一个 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

【问题讨论】:

即使我使用“allow read, write: if true”,请求也会被拒绝。 【参考方案1】:

计费方案与安全规则无关。

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

【讨论】:

用户已通过 firebase 身份验证,因为我正在使用“fbUser = firebaseAuth.getCurrentUser();”,并且我正在获取 fbUser。当我尝试访问 firestore 时会出现问题。 缺乏身份验证是您在此处显示的唯一解释。 Firestore 不会因为安全规则拒绝以外的任何原因发出“权限被拒绝”。如果您的规则需要身份验证,这意味着在查询时没有经过身份验证的用户。 如何检查是否是问题所在,即使我使用“允许读取,写入:如果为真”,请求也会被拒绝。如何调试这个问题?请原谅我的知识,因为我是 android 和 firestore 的新手,这是我的第一个应用程序 那你正在为应用修改错误的规则。你可能在错误的项目中。这不是 Stack Overflow 可以为您调试的。 感谢您的观察,但我正在正确的项目中修改正确的安全规则。这不是我要求 *** 调试的东西,而是某种调试问题的方法。【参考方案2】:

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

我在示例应用程序留言簿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.

(我会将此放在评论中,但我没有权限)。

【讨论】:

以上是关于Firebase 身份验证正在运行,但 Firestore 以缺少权限或权限不足为由拒绝请求的主要内容,如果未能解决你的问题,请参考以下文章

iOS 上的 Firebase 身份验证失败(Unity、Xcode)

具有真实电话号码的Firebase PhoneAuth不工作但白名单号正在运行 - Android

带有 Firebase 身份验证的 Nuxt s-s-r 身份验证防护

将 Firebase 身份验证与 Firebase 数据库连接

通过 Firebase UI 使用 Firebase 测试实验室电话身份验证

Firebase不会接收电子邮件/密码身份验证