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 数据库连接