我在实施 Firebase for 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。”,
堆栈:“FirebaseError:请求缺少所需的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据。请参阅https://developers.google.com/identity/sign-in/web/devconsole-project。在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 方法是可选的吗?使用它有什么好处?
谢谢你的帮助!