我正在使用 firebase admin sdk 运行节点服务器。但是,每次我尝试从服务器发送推送通知时,都会收到 401 错误。
这是我得到的确切错误:
errorInfo: {
code: 'messaging/authentication-error',
message: 'An error occurred when trying to authenticate to the FCM servers. Make sure the credential used to authenticate this SDK has the proper permissions. See https://firebase.google.com/docs/admin/setup for setup instructions. Raw server response: "<HTML>\n' +
'<HEAD>\n' +
'<TITLE>PROJECT_NOT_PERMITTED</TITLE>\n' +
'</HEAD>\n' +
'<BODY BGCOLOR="#FFFFFF" TEXT="#000000">\n' +
'<H1>PROJECT_NOT_PERMITTED</H1>\n' +
'<H2>Error 401</H2>\n' +
'</BODY>\n' +
'</HTML>\n' +
'". Status code: 401.'
},
codePrefix: 'messaging'
我不太确定为什么我没有该项目的权限。我已经设置了我的服务帐户,并下载了 .json 文件。我什至进入了 gcloud 平台并尝试添加任何看起来正确的权限。以下是与我的服务帐户关联的所有权限:
我在本地运行服务器,并像这样初始化应用程序:
const admin = require('firebase-admin');
const messaging = require('firebase-admin/messaging');
const serviceAccount = require('<path-to-key>');
const fbApp = admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
projectId: '<PROJECT_ID>',
databaseURL: '<DB_URL>'
});
我不确定还能做什么,因为我已经多次查看了 v1 文档,但仍然不知道我缺少什么权限。我什至确保“firebase 登录”到正确的谷歌帐户,看看这是否是一个问题。
这是我发送消息的代码:
const sendPushNotifications2 = async (topic, reminder) => {
const payload = genPayload2(reminder);
//await messaging.getMessaging(fbApp).sendToTopic(topic, payload);
await admin.messaging(fbApp).sendToTopic(topic, payload);
};
我已经验证了 .json 文件中的 client_id、client_email 和 private_key_id 值。我还没有验证 private_key 属性,因为我不确定在哪里可以找到它。
事实证明我禁用了这个 API:“Firebase In-App Messaging API” 原来这个问题之前也有人问过,但是没找到。 答案在这里
如果其他人遇到这个问题,这是我的解决方法:
APIs and Services
Enabled APIs & Services
+ Enable APIs and Services
Firebase In-App Messaging API
并确保它已启用。您也可以只搜索消息并确保所有云消息 API 都已启用。
问题是新的 Firebase 项目默认只启用新的“Firebase Cloud Messaging API (V1)”,并且使用该配置 - 使用新的 V1 API 的官方
firebase-admin
NodeJS 库 - 将无法发送消息,将收到 401 PROJECT_NOT_PERMITTED
错误。
为了能够从您的服务器发送消息,您还必须启用旧的“遗留”API。