Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
项目A中的Google App Engine无法使用项目B中的Firebase云消息_Firebase_Google Cloud Platform_Firebase Cloud Messaging_Firebase Admin_Google Cloud Iam - Fatal编程技术网

项目A中的Google App Engine无法使用项目B中的Firebase云消息

项目A中的Google App Engine无法使用项目B中的Firebase云消息,firebase,google-cloud-platform,firebase-cloud-messaging,firebase-admin,google-cloud-iam,Firebase,Google Cloud Platform,Firebase Cloud Messaging,Firebase Admin,Google Cloud Iam,我们正在运行两个独立的谷歌云项目,项目A和项目B 项目A当前正在运行基于应用程序引擎(AE)的API 项目A上的API需要访问项目B上的Firebase功能 ✅ 我已使用IAM在两个项目之间设置了跨项目访问,大多数功能运行正常 项目A上的App Engine能够访问项目B上的Firebase实时数据库(RTDB)和Firebase身份验证功能 但我们无法连接到项目B上的Firebase云消息传递 据我所知,通过Firebase admin SDK调用进行跟踪,我们可以获得访问令牌,它们都是有效的

我们正在运行两个独立的谷歌云项目,项目A项目B

项目A当前正在运行基于应用程序引擎(AE)的API

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

我已使用IAM在两个项目之间设置了跨项目访问,大多数功能运行正常

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

但我们无法连接到项目B上的Firebase云消息传递

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

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

这似乎源于对该服务的401未经授权的响应

在项目B中,我向项目A服务帐户抛出多少角色似乎并不重要

如果我使用一个来自Project B的独立Firebase服务帐户,并使用该json文件作为凭据,那么问题就会消失,但我不想到处分发凭据文件,没有它,其他一切都可以正常工作,除了FCM

FWIW这是我初始化firebase管理sdk的方式

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

firebaseAdmin.initializeApp({
    credential: firebaseAdmin.credential.applicationDefault(),
    projectId:'project-b',
    databaseURL: "https://project-b.firebaseio.com",
});
我还尝试将serviceAccountId选项设置为project B服务帐户电子邮件,该电子邮件在手动加载时可以工作,但不会改变任何内容(还添加了服务帐户令牌创建者角色)

服务帐户还被授予此处列出的所有权限

感觉好像缺少了一个简单的连接(角色或API设置),但我已经没有主意了

以前有没有人这样做过,可以提供一些指导

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

编辑2我使用最新的firebase admin sdk访问节点Js

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

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

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

在实时数据库的情况下,您只需将Firebase实时数据库管理员角色授予项目B上项目A的应用程序引擎服务帐户

在Firebase Cloud Messaging中,您可以授予项目B上的Firebase Cloud Messaging管理员角色和项目A上服务帐户的
cloudmessaging.messages.create
权限

这将绕过最初的401个未经授权的消息呼叫响应

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

对FCM的调用似乎不使用firebase admin Initialization中的
projectId
设置,而是始终针对创建服务帐户的项目(本例中为项目A)执行

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