使用服务帐户凭据模式的 Firebase 分发 android 应用程序的权限被拒绝

Posted

技术标签:

【中文标题】使用服务帐户凭据模式的 Firebase 分发 android 应用程序的权限被拒绝【英文标题】:Permission denied with Firebase distribution android app using service account credentials mode 【发布时间】:2021-12-04 13:24:05 【问题描述】:

我正在尝试从 Fabric 迁移到 Firebase,因为 Fabric 在 2020 年 3 月 31 日之后将无法使用。

我已经完成了第一步:将插件和依赖项添加到 gradle,添加分析 json 文件,甚至崩溃报告,所有这些似乎都是正确的,因为我可以在 Firebase 控制台中看到数据(分析和崩溃)。

但是,将应用分发系统从 Beta+Fastlane 迁移到 Firebase 时,我并不幸运。我正在尝试“使用 Gradle 将 android 应用分发给测试人员”选项。我已经添加了插件和依赖项,并且添加得很好,因为我可以运行 gradle 任务./gradlew appDistributionUploadMyVariant

我从 Google Cloud Platform 控制台为名为 firebase-adminsdk 的用户获取了 serviceCredentialsFile(我认为这个名称是由 Firebase 系统提供的),用于正确的项目。用户的电子邮件类似于 firebase-adminsdk-xxx@my_project.iam.gserviceaccount.com,与我在 Firebase 控制台 -> 设置 -> 服务帐户 -> Firebase Admin SDK 中看到的相同。

我已经下载了带有凭据的 json 文件,gradle 可以找到它,因为如果故意为文件输入错误的路径 URL,它会记录 Service credentials file does not exist。根据我上面提到的几行,此文件的内容具有正确的 client_emailproject_id 值。

但我收到 403 错误。如果我执行任务./gradlew appDistributionUploadMyVariant --info,我会粘贴一些我得到的信息(我已经隐藏了一些私人信息):

Task ':app:appDistributionUploadMyVariant' is not up-to-date because:
  Task has not declared any outputs despite executing actions.
Found APK at /MyFolder/app/build/outputs/apk/qa/qaType/app-qa-qaType.apk.
Uploading APK to Firebase App Distribution...
Getting appId from output of google services plugin
-------------- REQUEST  --------------
POST https://oauth2.googleapis.com/token
Accept-Encoding: gzip
User-Agent: Google-HTTP-Java-Client/1.28.0 (gzip)
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 808

curl -v --compressed -X POST -H 'Accept-Encoding: gzip' -H 'User-Agent: Google-HTTP-Java-Client/1.28.0 (gzip)' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -d '@-' -- 'https://oauth2.googleapis.com/token' << $$$
Total: 808 bytes
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1N(...)
-------------- RESPONSE --------------
HTTP/1.1 200 OK
Transfer-Encoding: chunked
X-Frame-Options: SAMEORIGIN
Alt-Svc: quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
Cache-Control: private
Server: scaffolding on HTTPServer2
X-Content-Type-Options: nosniff
Content-Encoding: gzip
Vary: Referer
Vary: X-Origin
Vary: Origin
X-XSS-Protection: 0
Date: Fri, 22 Nov 2019 14:47:29 GMT
Content-Type: application/json; charset=utf-8

Total: 207 bytes

  "access_token": "access_token_value",
  "expires_in": 3600,
  "token_type": "Bearer"

-------------- REQUEST  --------------
GET https://firebaseappdistribution.googleapis.com/v1alpha/apps/appId
Accept-Encoding: gzip
Authorization: <Not Logged>
User-Agent: Firebase App Distro Client/1.2.0
x-app-distro-api-client-id: com.google.firebase
x-app-distro-api-client-type: gradle
x-app-distro-api-client-version: 1.2.0

curl -v --compressed -H 'Accept-Encoding: gzip' -H 'Authorization: <Not Logged>' -H 'User-Agent: Firebase App Distro Client/1.2.0' -H 'x-app-distro-api-client-id: com.google.firebase' -H 'x-app-distro-api-client-type: gradle' -H 'x-app-distro-api-client-version: 1.2.0' -- 'https://firebaseappdistribution.googleapis.com/v1alpha/apps/appId'
-------------- RESPONSE --------------
HTTP/1.1 403 Forbidden
Transfer-Encoding: chunked
X-Frame-Options: SAMEORIGIN
Alt-Svc: quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
Cache-Control: private
Server: ESF
X-Content-Type-Options: nosniff
Content-Encoding: gzip
Vary: Referer
Vary: X-Origin
Vary: Origin
X-XSS-Protection: 0
Date: Fri, 22 Nov 2019 14:47:30 GMT
Content-Type: application/json; charset=UTF-8

Total: 126 bytes

  "error": 
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED"
  


:app:appDistributionUploadMyVariant (Thread[Daemon worker Thread 8,5,main]) completed. Took 1.552 secs.
AAPT2 aapt2-3.4.1-5326820-osx Daemon #0: shutdown

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:appDistributionUploadMyVariant'.
> App Distribution failed to fetch app information: [403] The caller does not have permission

我也尝试从 gradle 文件中传递 appId 值,结果相同。

有什么想法吗?

【问题讨论】:

【参考方案1】:

错误“[403] 调用者没有权限。”是由权限问题引起的。 ​​​​​​​​​

您能否尝试关注this,了解如何创建服务帐户以及在哪里下载 json,看看它是否有效?

也欢迎您与firebase support 联系以获取更多信息。 :)

【讨论】:

感谢@Jing Li,它正在像您建议的链接一样创建服务帐户。谢谢。 Firebase App Distribution 在这里说Add the Firebase Quality Admin role [firebase.google.com/docs/app-distribution/android/… 这不起作用。我们必须将最低角色/权限添加为 Firebase 管理员 以使用命令行使用 gradle 成功分发应用程序。 检查console.cloud.google.com/iam-admin。我认为你的角色至少应该是编辑才能摆脱这个错误。【参考方案2】:

请尝试运行

firebase logout

然后再次登录(或使用令牌)。

我遇到了同样的问题,并按照上述所有其他步骤进行操作,但没有成功。但是,当我使用调试标志运行 firebase appdistribution:distribute --debug foo 时,我注意到我仍然登录到另一个 firebase 实例,这似乎导致了问题。

【讨论】:

【参考方案3】:

服务帐号的角色是:“Firebase App Distribution Admin SDK Service Agent”:

使用 Admin SDK 对 Firebase App Distribution 进行读写访问

或作为个人permissions。

【讨论】:

以上是关于使用服务帐户凭据模式的 Firebase 分发 android 应用程序的权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

使用没有文件的服务帐户凭据初始化 firebase 管理 - System.NotSupportedException - “不支持标记‘27’。”

Firebase 使用 Google 帐户覆盖登录

Firebase linkwithcredential 不适用于 Facebook

firebase 导入服务抛出错误

将 iOS 应用程序提交到商店,但无需访问开发者计划帐户,而是提供配置文件和分发证书

配置 gsutil 以在 pod 内使用 kubernetes 服务帐户凭据