Я реализую функцию веб-уведомлений в React + Firebase. Несмотря на успешное получение токена веб-уведомления, ошибка возникает при отправке с помощью Firebase Cloud Messaging.
Ошибка ниже:
Обмен сообщениями: возникла проблема при подписке пользователя на FCM: В запросе отсутствуют необходимые учетные данные для аутентификации. Ожидаемый токен доступа OAuth 2, логин Cook ie или другие действительные учетные данные для аутентификации. См. https://developers.google.com/identity/sign-in/web/devconsole-project.
Код Firebase (React):
import * as firebase from 'firebase/app'
import 'firebase/analytics'
import 'firebase/auth'
import 'firebase/database'
import 'firebase/firestore'
import 'firebase/functions'
import 'firebase/storage'
import 'firebase/messaging'
const firebaseConfig = {
apiKey: process.env.REACT_APP_FIREBASE_API_KEY,
authDomain: process.env.REACT_APP_FIREBASE_AUTH_DOMAIN,
databaseURL: process.env.REACT_APP_FIREBASE_DATABASE_URL,
projectId: process.env.REACT_APP_FIREBASE_PROJECT_ID,
storageBucket: process.env.REACT_APP_FIREBASE_STORAGE_BUCKET,
messagingSenderId: process.env.REACT_APP_FIREBASE_MESSAGING_SENDER_ID,
appId: process.env.REACT_APP_FIREBASE_APP_ID,
measurementId: process.env.REACT_APP_FIREBASE_MEASUREMENT_ID,
}
// Initialize Firebase
firebase.initializeApp(firebaseConfig)
firebase.analytics()
// comment out when debug
// firebase.firestore.setLogLevel('debug')
export const database = firebase.database()
export const firestore = firebase.firestore()
export const functions = firebase.functions()
export const storage = firebase.storage()
// comment out when use emulator
// functions.useFunctionsEmulator('http://localhost:5001')
export default firebase
firestore
.doc(`users/${currentUserUid}`)
.get()
.then((userDocSnap) => {
if (!userDocSnap.exists) return
if (userDocSnap.data().webNotification) return
if (firebase.messaging.isSupported()) {
const messaging = firebase.messaging()
messaging.usePublicVapidKey(
process.env.REACT_APP_FIREBASE_PUBLIC_VALID_KEY,
)
messaging
.requestPermission()
.then(() => {
messaging
.getToken()
.then((token) => {
userDocSnap.ref.update({
webNotification: token,
})
})
.catch((err) => {
console.log('Failed to get token', err)
})
})
.catch((err) => {
console.log("Can't get permission", err)
})
}
})
Pu sh уведомление (функция)
const sendWebNotification = (data) => {
try {
const headers = {
headers: {
'Content-Type': 'application/json',
Authorization: 'Bearer ' + webApiKey,
},
}
axios
.post('https://fcm.googleapis.com/fcm/send', data, headers)
.catch((err) => {
console.log('Error:', err)
})
} catch (error) {
console.log(error)
}
}