Node.js使用Firebase Admin SDK发送FCM消息时认证服务器报错
FCM 主题消息发送认证错误解决方案
按以下顺序排查即可解决问题,不需要重复校验密钥路径或反复开关Cloud Messaging服务:
- 给服务账号绑定正确的IAM角色
新创建的服务账号默认不携带FCM消息发送权限,你需要打开对应项目的Google Cloud IAM管理页,找到密钥文件中client_email字段对应的服务账号,为其绑定Firebase Cloud Messaging Admin角色,绑定后等待2分钟左右待权限全局生效,再重新运行代码即可。注意不要给服务账号绑定低于该权限的角色,否则无法通过发送接口的权限校验。 - 校验密钥文件的有效性与归属
确认你本地引用的JSON密钥文件没有被手动修改过任何内容,也没有在控制台被删除/轮换作废;同时核对密钥文件内的project_id字段,和你当前启用Cloud Messaging服务的项目ID完全一致,跨项目误用密钥是触发该报错的高频原因。 - 修正代码实现问题
你当前代码存在冗余引入、API版本过旧、参数配置位置错误的问题,可直接替换为以下可运行版本:
const admin = require('firebase-admin'); async function run() { try { const serviceAccount = require("/Users/myUser/src/my_project/node_admin/my_project-5617a-firebase-adminsdk-lwpk6-5dad9000e0.json"); const topic = 'all'; admin.initializeApp({ credential: admin.credential.cert(serviceAccount), }); const message = { notification: { title: "Test1234", body: "body", }, android: { priority: "high", notification: { sound: "test-sound.wav" } }, apns: { payload: { aps: { sound: "test-sound.wav" } } }, topic: topic }; const res = await admin.messaging().send(message); console.log("消息发送成功,消息ID:", res); } catch (e) { console.error("消息发送失败:", e); } } run();
调整点说明:
- 删除了开头冗余重复的firebase-admin引入
- 替换已不推荐使用的
sendToTopic旧API为官方推荐的sendAPI - 将
sound、priority参数移到对应平台的配置节点下,顶层notification的相关参数不会对各端生效,还可能触发接口异常 - 排查网络拦截问题
如果你的运行环境配置了代理、防火墙规则,先确认可以正常连通FCM服务端点,网络层拦截请求时,SDK也会抛出认证失败的误导性报错。
内容的提问来源于stack exchange,提问作者Scorb
相关产品推荐
相关产品推荐

