Fungsi cloud Firebase memicu FCM tetapi Permintaan tidak memiliki kredensial autentikasi yang diperlukan

Saya mencoba menggunakan firebase-admin di dalam fungsi cloud firebase untuk mengirim pesan melalui firebase cloud messages (FCM).

Saat membaca dokumentasi tertulis

Untuk menggunakan Admin FCM API, Anda harus terlebih dahulu mengikuti langkah-langkah di Menambahkan Firebase Admin SDK ke Server Anda.

Tapi menurut saya ini tidak diperlukan karena saya hanya menggunakan fungsi cloud?

Bagaimanapun, semuanya berfungsi hingga admin.messaging().send di mana saya mendapatkan kesalahan ini:

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' }

Ini adalah kode sumber fungsi cloud saya

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)
        })
    })
  })

Token perangkat disimpan di firestore dan diambil dari firestore di dalam fungsi cloud ini juga. Format token perangkat sudah benar. Saya telah menggantinya dengan placeholder untuk contoh ini.

Saya juga mencari pertanyaan serupa, tetapi satu-satunya yang dapat saya temukan adalah yang ini


person mesqueeb    schedule 12.01.2019    source sumber
comment
Menurut saya pesan error yang dikirim oleh FCM cukup menyesatkan di sini. Saya sudah melaporkan hal ini ke tim FCM untuk ditindaklanjuti dan ditingkatkan.   -  person Hiranya Jayathilaka    schedule 14.01.2019


Jawaban (1)


Setelah banyak mencari, saya menemukan daftar kesalahan oleh firebase dan di daftar ini Saya menelusuri kode kesalahan 'messaging/invalid-apns-credentials' yang mengatakan:

Pesan yang ditargetkan ke perangkat iOS tidak dapat dikirim karena sertifikat SSL APN yang diperlukan belum diunggah atau telah kedaluwarsa. Periksa validitas sertifikat pengembangan dan produksi Anda.

Jadi saya pikir, saya belum menyiapkan sertifikat "produksi" saya, dan mungkin build cordova dev saya diperlakukan sebagai build produksi! Jadi saya langsung saja menambahkan sertifikat produksi, juga menghapus dan menambahkan kembali sertifikat dev untuk memastikannya, dan berhasil.

person mesqueeb    schedule 12.01.2019