Облачная функция Firebase запускает FCM, но в запросе отсутствуют необходимые учетные данные для аутентификации

Я пытаюсь использовать firebase-admin внутри облачной функции firebase для отправки сообщения через облачный обмен сообщениями firebase (FCM).

При чтении документации говорится

Чтобы использовать Admin FCM API, вы должны сначала выполнить шаги, описанные в разделе Добавление Firebase Admin 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 и также извлекаются из хранилища данных внутри этой облачной функции. Формат токена устройства правильный. В этом примере я заменил его заполнителем.

Я также поискал похожие вопросы, но единственный, который я смог найти, был этот


comment
Я думаю, что сообщение об ошибке, отправленное FCM, здесь вводит в заблуждение. Я сообщил об этом команде FCM, чтобы продолжить и улучшить.   -  person Hiranya Jayathilaka    schedule 14.01.2019


Ответы (1)


После долгих поисков я нашел список ошибок от firebase и в этом списке Я отследил код ошибки 'messaging/invalid-apns-credentials', в котором говорилось:

Сообщение, предназначенное для устройства iOS, не может быть отправлено, поскольку требуемый сертификат SSL APN не был загружен или истек. Проверьте действительность ваших сертификатов разработки и производства.

Итак, я решил, что я еще не настроил свой "производственный" сертификат, и, возможно, моя сборка для разработки Cordova рассматривается как производственная сборка! Поэтому я просто добавил производственный сертификат, а также удалил и повторно добавил сертификат разработчика, чтобы быть уверенным, и это сработало.

person mesqueeb    schedule 12.01.2019