Google 项目 A 中的 App Engine 无法使用项目 B 中的 Firebase 云消息传递
Google App Engine from project A cannot use Firebase Cloud Messaging from project B
我们有 运行 2 个独立的 Google 云项目,项目 A 和 项目 B。
项目 A 目前是 运行 基于 API 的 App Engine (AE)。
项目 A 上的 API 需要访问项目 B 上的 Firebase 功能。
✅ 我使用 IAM 在两个项目之间设置了跨项目访问,并且大多数功能运行良好。
项目 A 上的 App Engine 能够访问项目 B 上的 Firebase 实时数据库 (RTDB) 和 Firebase Auth 功能。
但是我们无法连接到项目 B
上的 Firebase 云消息传递
据我所知,通过 Firebase admin SDK 调用进行跟踪,我们能够获得访问令牌,并且它们都是有效的,因为我们可以使用一些服务(即 RTDB、Auth)
但是,当我们尝试使用 Firebase 云消息传递时,我们收到以下错误:尝试对 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 上创建的)。所以听起来可能不是角色问题,也不是跨项目问题?
编辑 2 我在 Node Js 上安装了最新的 firebase admin sdk
编辑 3 忽略第一个编辑,我没有正确配置自定义服务帐户,在项目 B 中与从头开始创建的服务帐户一起工作正常。所以回到交叉-项目问题然后我猜..
所以在实时数据库的情况下,您只需要将 Firebase Realtime Database Admin 角色授予项目 A 在项目 B 上的 App Engine 服务帐户即可。
在 Firebase Cloud Messaging 中,您可以授予项目 B 上的 Firebase Cloud Messaging Admin 角色 AND cloudmessaging.messages.create
对项目 A 上的服务帐户 的权限.
这将绕过来自消息呼叫的初始 401 未经授权响应。
但是,这仍然会导致错误,这次是 NOT FOUND,表示未找到订阅令牌。
似乎对 FCM 的调用不使用 firebase 管理员初始化中的 projectId
设置,并且始终针对创建服务帐户的项目(在本例中为项目 A)执行。
我无法找到在指定的 projectId
范围内从另一个项目执行 FCM 调用的方法。
我们有 运行 2 个独立的 Google 云项目,项目 A 和 项目 B。
项目 A 目前是 运行 基于 API 的 App Engine (AE)。
项目 A 上的 API 需要访问项目 B 上的 Firebase 功能。
✅ 我使用 IAM 在两个项目之间设置了跨项目访问,并且大多数功能运行良好。
项目 A 上的 App Engine 能够访问项目 B 上的 Firebase 实时数据库 (RTDB) 和 Firebase Auth 功能。
但是我们无法连接到项目 B
上的 Firebase 云消息传递据我所知,通过 Firebase admin SDK 调用进行跟踪,我们能够获得访问令牌,并且它们都是有效的,因为我们可以使用一些服务(即 RTDB、Auth)
但是,当我们尝试使用 Firebase 云消息传递时,我们收到以下错误:尝试对 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 上创建的)。所以听起来可能不是角色问题,也不是跨项目问题?
编辑 2 我在 Node Js 上安装了最新的 firebase admin sdk
编辑 3 忽略第一个编辑,我没有正确配置自定义服务帐户,在项目 B 中与从头开始创建的服务帐户一起工作正常。所以回到交叉-项目问题然后我猜..
所以在实时数据库的情况下,您只需要将 Firebase Realtime Database Admin 角色授予项目 A 在项目 B 上的 App Engine 服务帐户即可。
在 Firebase Cloud Messaging 中,您可以授予项目 B 上的 Firebase Cloud Messaging Admin 角色 AND cloudmessaging.messages.create
对项目 A 上的服务帐户 的权限.
这将绕过来自消息呼叫的初始 401 未经授权响应。
但是,这仍然会导致错误,这次是 NOT FOUND,表示未找到订阅令牌。
似乎对 FCM 的调用不使用 firebase 管理员初始化中的 projectId
设置,并且始终针对创建服务帐户的项目(在本例中为项目 A)执行。
我无法找到在指定的 projectId
范围内从另一个项目执行 FCM 调用的方法。