【问题标题】:'An error occurred when trying to authenticate to the FCM servers' on Firebase Cloud FunctionsFirebase Cloud Functions 上的“尝试对 FCM 服务器进行身份验证时发生错误”
【发布时间】:2022-06-25 10:47:46
【问题描述】:

我正在尝试在创建 Firestore 文档(消息)时触发的 Firebase 云函数中使用 FCM 向主题发送消息。订阅主题(也使用函数完成)并触发发送功能可以正常工作,但实际发送失败:

Error: 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.

以及一些包含<H1>PROJECT_NOT_PERMITTED</H1><H1>PROJECT_NOT_PERMITTED</H1> 的原始HTML。

这是我的代码(index.ts):

import * as admin from 'firebase-admin';

admin.initializeApp({
    credential: admin.credential.applicationDefault(),
});

export * from './messages';

和(messages.ts):

import * as admin from 'firebase-admin';
import * as functions from 'firebase-functions';

export const publishMessage = functions
  .firestore.document('/messages/{messageId}').onCreate(
    (snapshot, context) => {
      const data = snapshot.data();
      const message = {
        notification: {
          title: `${data.sentBy} sent a message`,
          body: data.message,
        },
      };

      return admin.messaging().sendToTopic('messages', message);
    },
  );

根据https://firebase.google.com/docs/cloud-messaging/auth-server#provide-credentials-using-adc 这应该可以工作。我也尝试过不带任何参数(https://firebase.google.com/docs/admin/setup#initialize-without-parameters),但同样失败。我错过了什么?

【问题讨论】:

  • 您能否确认您使用的是活跃的service account
  • 据我所知。这是一个全新的 Firebase 项目,并为其创建了一个服务帐户。当我转到 IAM & Admin -> Service Accounts 的 Google Cloud Console 时,我看到两个:firebase-adminsdk-xxxxx@.iam.gserviceaccount.com 和 @appspot.gserviceaccount.com 并且两者都已启用。他们都没有任何钥匙,但这应该不是必需的,对吧?
  • 是的,没关系,重要的是您的<projectId>@appspot.gserviceaccount.com 中包含的角色。我已经发布了一个答案来进一步讨论这个问题。

标签: typescript firebase google-cloud-functions firebase-cloud-messaging firebase-admin


【解决方案1】:

删除我<projectId>@appspot.gserviceaccount.com中的(roles/firebase.admin)后,我也遇到了你的错误:

由于 Firebase Cloud Functions 正在使用 <projectId>@appspot.gserviceaccount.com 服务帐户。添加到此服务帐号的角色和权限会转移到 Cloud Functions 运行时。

正如你已经说过的,你有<projectId>@appspot.gserviceaccount.com,确保它有一个(roles/firebase.admin),并且根据这个documentation,它拥有cloudmessaging.*的完全访问权限。

在我重新添加 <projectId>@appspot.gserviceaccount.com 和对应的 (roles/firebase.admin) 后:

我尝试添加另一个 Firestore 文档来测试该功能(大约 10 分钟后),以确保我的权限更改已生效:

对于其他选项,您也可以尝试添加:

  1. Firebase 增长管理员 (roles/firebase.growthAdmin);
  2. 或者您可以尝试 Firebase Cloud Messaging API Admin (roles/firebasecloudmessaging.admin) 的测试版,因为它也有 cloudmessaging.* 权限。

您也可以查看other roles的相应权限。

【讨论】:

  • 我将角色添加到两个帐户,但没有任何变化。我也不明白为什么我需要这样做,因为我从未禁用或删除任何东西,我有一个新的 Firebase 项目。
  • 我已经更新了我的答案并提供了屏幕截图,以及我为复制您的错误并找到解决方案而采取的步骤。
  • 我重新测试了它,也等了大约 20 分钟(在我之前的测试中没有等待)但它并没有改变任何东西,很遗憾。
  • 由于我提出的解决方案没有解决您的问题,您可以直接向Firebase Support提交支持票。
【解决方案2】:

事实证明,我需要调用admin.messaging().send(message);并将topic: 'messages'字段放入message对象,而不是使用admin.messaging().sendToTopic('messages', message);,然后它就可以正常工作了。

【讨论】:

    猜你喜欢
    • 2020-01-06
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 2019-11-19
    • 2018-06-15
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多