Почему getToken () Firebase Cloud Messaging работает, только если я опускаю метод usePublicVapidKey, почему?
У меня есть конкретная проблема с реализацией Firebase для Firebase Cloud Messaging (FCM):
Как вы можете видеть в коде ниже, //messaging.usePublicVapidKey("<MY VAPID KEY IN HERE>");
комментируется Ключ VAPID был получен с помощью команды: web-push generate-vapid-keys
в терминале сервера. Если я раскомментирую эту строку, я получаю эту ошибку в консоли при вызове notification_permission()
:
код: "обмен сообщениями / токен-подписка-ошибка",
сообщение: "В запросе отсутствуют необходимые учетные данные для проверки подлинности. Ожидаемый токен доступа OAuth 2, файл cookie для входа в систему или другие действительные учетные данные для проверки подлинности. См. https://developers.google.com/identity/sign-in/web/devconsole-project.",
stack: "FirebaseError: В запросе отсутствуют необходимые учетные данные для проверки подлинности. Ожидаемый токен доступа OAuth 2, cookie для входа в систему или другие действительные учетные данные для проверки подлинности. См. https://developers.google.com/identity/sign-in/web/devconsole-project. at https://www.gstatic.com/firebasejs/4.12.1/firebase-messaging.js:6:8316"
Это мой ток index.html
файл:
<script src="https://www.gstatic.com/firebasejs/4.12.1/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/4.12.1/firebase-messaging.js"></script>
<script>
var config = {
apiKey: "<MY FIREBASE API KEY>",
authDomain: "<MY FIREBASE PROJECT ID>.firebaseapp.com",
databaseURL: "https://<MY FIREBASE PROJECT ID>.firebaseio.com",
projectId: "<MY FIREBASE PROJECT ID>",
storageBucket: "<MY FIREBASE PROJECT ID>.appspot.com",
messagingSenderId: "<MY FIREBASE SENDER ID?>"
};
firebase.initializeApp(config);
//messaging app
const messaging = firebase.messaging();
//vapid
//messaging.usePublicVapidKey("<MY VAPID KEY IN HERE>");
//register service worker
navigator.serviceWorker.register('firebase-messaging-sw.js').then(function(registration) {
console.log('Service Worker Registered!', registration);
}).catch(function(err) {
console.error('Service Worker registration failed', err);
});
</script>
Это функция javascript, которую я вызываю, чтобы получить разрешение пользователя на получение уведомлений и получение токена пользователя:
<script>
function notification_permission() {
messaging.requestPermission().then(function(permission) {
console.log('Notification permission granted.', permission);
messaging.getToken().then(function(current_token) {
if(current_token) {
//update user token
// update_token(current_token);
console.log('token', current_token);
} else {
// you don't have permission to show notifications
// detect whether they are blocked or not, then show your custom UI
}
}).catch(function(err) {
// retrieving token failed, analyze the error
console.error('retrieving token failed, analyze the error', err);
});
}).catch(function(err) {
console.error('Unable to get permission to notify.', err)
});
}
</script>
У меня уже есть это на моем manifest.json
файл:
{
"gcm_sender_id": "103953800507",
"serviceworker": {
"src": "firebase-messaging-sw.js",
"scope": "/"
}
}
Мои конкретные вопросы с этой конфигурацией:
Это нормально использовать
web-push generate-vapid-keys
получить ключ VAPID только один раз и использовать тот же ключ VAPID для всех пользовательских запросов?Почему
getToken()
сбой метода при использовании ключа VAPID?Является ли метод VAPID необязательным? Каковы преимущества его использования?
Спасибо за вашу помощь!
0 ответов
1) да.
2) потому что токен связан с учетной записью firebase, а не с пустым ключом. В обход firebase вы не можете получить токен.
3) использование vapid полезно, когда НЕ используется firebase.