将 FCM API 从旧版迁移到 v1 时出错:请求缺少所需的身份验证凭据。预期的 OAuth 2 访问

问题描述 投票:0回答:1

我们在后端使用 FCM 将付款通知发送到移动应用程序。最终,它停止工作,因为旧版 API 已于 2024 年 7 月关闭。Google 提供了迁移指南

这是我发送 FCM 消息的新函数:

async function sendFCMInvoicePaidNotificationMessagev2(to, transactionID, mobileNumber, callback) {
    var myAccessToken = await getAccessToken()
    unirest.post('https://fcm.googleapis.com/v1/projects/xxxx-xxxx-xxxx/messages:send').headers({
        'Authorization': myAccessToken,
        'Accept': 'application/json',
        'Content-Type': 'application/json',
        'cache-control': 'no-cache'
    }).proxy('http://xxxx:1234').send({
        'to': to,
        'priority': 'high',
        'restricted_package_name': config.get('googlePkgName'),
        'notification': {
            'title': 'Invoice # ' + transactionID + ' has been paid. Thank you.'
        },
        'data': {
            'transactionID': transactionID,
            'mobileNumber': mobileNumber
        }
    }).end(function(responseFCM) {
        callback(responseFCM);
    });
}


function getAccessToken() {
    var SCOPES = ['https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/firebase.messaging'];
    return new Promise(function(resolve, reject) {
      const key = require('./service_account.json');
      const jwtClient = new google.auth.JWT(
        key.client_email,
        null,
        key.private_key,
        SCOPES,
        null
      );
      jwtClient.authorize(function(err, tokens) {
        if (err) {
          reject(err);
          return;
        }
        resolve(tokens.access_token);
      });
    });
  }

运行服务,我得到以下响应:

{"statusCode":401,"body":{"error":{"code":401,"message":"请求是 缺少所需的身份验证凭据。预期的 OAuth 2 访问 令牌、登录 cookie 或其他有效的身份验证凭据。看 https://developers.google.com/identity/sign-in/web/devconsole-project。","status":"未经身份验证","details":[{"@type":"type.googleapis.com /google.rpc.ErrorInfo","reason":"CREDENTIALS_MISSING","domain":"googleapis.com","metadata":{"method":"google.firebase.fcm.v1.FcmService.SendMessage"," service":"fcm.googleapis.com"}}]}},"headers":{"www-authenticate":"承载者 领域=“https://accounts.google.com/”“,”变化“:”X-Origin,Referer, 来源,接受编码","内容类型":"application/json; 字符集=UTF-8","日期":"2024 年 9 月 17 日星期二 07:14:13 GMT","服务器":"脚手架上 HTTPServer2","缓存控制":"私有","x-xss-protection":"0","x-frame-options":"SAMEORIGIN","x-content-type-options":"nosniff" ,"alt-svc":"h3=":443"; ma=2592000,h3-29=":443"; ma=2592000","accept-ranges":"none","connection":"close","transfer-encoding":"chunked"},"request":{"uri":{"protocol":"https :","斜杠":true,"auth":null,"主机":"fcm.googleapis.com","端口":443,"主机名":"fcm.googleapis.com","哈希":null ,“搜索”:空,“查询”:空,“路径名”:“/v1/projects/xxxxxxxx/messages:发送”,“路径”:“/v1/projects/xxxxxxxx/messages:发送”,“href” :"https://fcm.googleapis.com/v1/projects/xxxxxxxx/messages:send"},"method":"post","headers":{"授权":{},"接受":"申请/json","Content-Type":"application/json","cache-control":"no-cache","content-length":386}}}

嗯“预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据”...也许我没有正确创建 service_account.json ?我认为我正确地遵循了 Google 的步骤。要为您的服务帐户生成私钥文件:

  1. 在 Firebase 控制台中,打开设置 > 服务帐户
  2. 单击“生成新私钥”,然后单击“生成”进行确认 钥匙。
  3. 安全存储包含密钥的 JSON 文件。

enter image description here

这里出了什么问题?

node.js firebase-cloud-messaging
1个回答
0
投票

您需要在访问令牌之前添加授权类型 Bearer

    async function sendFCMInvoicePaidNotificationMessagev2(to, transactionID, mobileNumber, callback) {
    var myAccessToken = await getAccessToken()
    unirest.post('https://fcm.googleapis.com/v1/projects/xxxx-xxxx-xxxx/messages:send').headers({
        'Authorization': 'Bearer ' + myAccessToken,
        'Accept': 'application/json',
        'Content-Type': 'application/json',
        'cache-control': 'no-cache'
    }).proxy('http://xxxx:1234').send({
        'to': to,
        'priority': 'high',
        'restricted_package_name': config.get('googlePkgName'),
        'notification': {
            'title': 'Invoice # ' + transactionID + ' has been paid. Thank you.'
        },
        'data': {
            'transactionID': transactionID,
            'mobileNumber': mobileNumber
        }
    }).end(function(responseFCM) {
        callback(responseFCM);
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.