我正在尝试在Firebase云函数中使用firebase-admin通过Firebase云消息(FCM)发送消息。
在阅读文档时,它说
要使用 Admin FCM API,您必须先按照将 Firebase 管理员 SDK 添加到您的服务器中的步骤操作。
但我认为这不是必需的,因为我只使用云函数?
无论如何,这一切都有效,直到我收到此错误的admin.messaging().send
点:
Error sending message: { Error: Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.
at FirebaseMessagingError.Error (native)
at FirebaseMessagingError.FirebaseError [as constructor] (/user_code/node_modules/firebase-admin/lib/utils/error.js:39:28)
at FirebaseMessagingError.PrefixedFirebaseError [as constructor] (/user_code/node_modules/firebase-admin/lib/utils/error.js:85:28)
at new FirebaseMessagingError (/user_code/node_modules/firebase-admin/lib/utils/error.js:241:16)
at Function.FirebaseMessagingError.fromServerError (/user_code/node_modules/firebase-admin/lib/utils/error.js:271:16)
at FirebaseMessagingRequestHandler.handleHttpError (/user_code/node_modules/firebase-admin/lib/messaging/messaging-api-request.js:125:50)
at /user_code/node_modules/firebase-admin/lib/messaging/messaging-api-request.js:113:23
at process._tickDomainCallback (internal/process/next_tick.js:135:7)
errorInfo:
{ code: 'messaging/invalid-apns-credentials',
message: 'Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.' },
codePrefix: 'messaging' }
这是我云函数的源代码
import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'
admin.initializeApp(functions.config().firebase)
const firestore = admin.firestore()
firestore.settings({timestampsInSnapshots: true})
exports.notification = functions.firestore
.document(path)
.onUpdate(async (change, context) => {
const deviceTokens = ['deviceToken-123123123']
deviceTokens.forEach(token => {
const fcmMessage = {
notification: {title: 'test title', body: 'test body'},
token
}
admin.messaging().send(fcmMessage)
.then((response) => {
// Response is a message ID string.
console.log('Successfully sent message:', response)
})
.catch((error) => {
console.log('Error sending message:', error)
})
})
})
设备令牌存储在 firestore 中,并在此云函数内从 firestore 中检索。设备令牌的格式正确。在本例中,我已将其替换为占位符。
我也四处寻找类似的问题,但我唯一能找到的就是这个
经过多次搜索,我找到了Firebase的错误列表,在此列表中,我跟踪了错误代码'messaging/invalid-apns-credentials'
其中的内容:
无法发送针对 iOS 设备的邮件,因为所需的 APNs SSL 证书未上传或已过期。检查开发和生产证书的有效性。
所以我想,我还没有设置我的"生产"证书,也许我的 cordova 开发版本被视为生产版本!所以我只是继续添加生产证书,还删除并重新添加了开发证书以确保,它有效。