微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

项目 A 中的 Google App Engine 无法使用项目 B

如何解决项目 A 中的 Google App Engine 无法使用项目 B

我们正在运行 2 个独立的 Google Cloud 项目,项目 A项目 B

项目 A 当前正在运行基于 App Engine (AE) 的 API。

项目 A 上的 API 需要访问项目 B 上的 Firebase 功能

我已经使用 IAM 在两个项目之间设置了跨项目访问大多数功能都运行良好

项目 A 上的 App Engine 能够访问项目 B 上的 Firebase 实时数据库 (RTDB) 和 Firebase 身份验证功能

但是我们无法连接到项目 B 上的 Firebase Cloud Messaging

据我所知,通过 Firebase 管理 SDK 调用进行跟踪,我们能够获得访问令牌,并且它们都是有效的,因为我们可以使用某些服务(即 RTDB、Auth)

但是,当我们尝试使用 Firebase Cloud 消息传递时,我们收到以下错误尝试向 FCM 服务器进行身份验证时发生错误。确保用于验证此 SDK 的凭据具有适当的权限。

这似乎源自对该服务的 401 未经授权的响应https://iid.googleapis.com/iid/v1:batchAdd

我在项目 A 服务帐户中投入多少项目 B 中的角色似乎并不重要。

如果我使用源自项目 B 的单独 Firebase 服务帐户并使用该 json 文件作为凭据,那么问题就会消失,但我不想分发凭据文件,其他一切都可以正常工作,除了FCM。

FWIW 这就是我初始化 firebase admin sdk 的方式

const firebaseAdmin = require('firebase-admin');

firebaseAdmin.initializeApp({
    credential: firebaseAdmin.credential.applicationDefault(),projectId:'project-b',databaseURL: "https://project-b.firebaseio.com",});

我还尝试将 serviceAccountId 选项设置为手动加载时有效的项目 B 服务帐户电子邮件,但这不会改变任何内容(还添加了服务帐户令牌创建者角色)

服务帐户也已获得此处列出的所有权限https://firebase.google.com/docs/projects/iam/permissions#messaging

感觉缺少一个简单的连接(角色或 API 设置),但我已经没有想法了。

有没有人做过这件事并且可以提供一些指导?

编辑 [在编辑 3 中更正] 我还尝试在项目 B 上手动创建一个服务帐户,其工作角色与可用的 Firebase 服务帐户相同我遇到了同样的问题(即使它是在项目 B 上创建的)。听起来可能不是角色问题,也不是跨项目问题?

EDIT 2 我在 Node Js 上使用最新的 firebase admin sdk

EDIT 3 忽略第一次编辑,我没有正确配置自定义服务帐户,在项目 B 中从头创建的服务帐户工作正常。所以回到跨项目问题然后我猜..

解决方法

因此,在实时数据库的情况下,您只需将 Firebase 实时数据库管理员角色授予项目 B 上的项目 A 的 App Engine 服务帐户。

在 Firebase Cloud Messaging 中,您可以为项目 B 授予 Firebase Cloud Messaging Admin 角色对项目 A 服务帐户的 cloudmessaging.messages.create 权限。 >

这将绕过来自消息调用的初始 401 未授权响应。

但是,这仍然会导致错误,这次 NOT FOUND,这表明未找到订阅令牌。

对 FCM 的调用似乎不使用 Firebase 管理员初始化中的 projectId 设置,并且始终针对创建服务帐户的项目(在本例中为项目 A)执行。

我无法找到在指定的 projectId 范围内从另一个项目执行 FCM 调用的方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?