带有Firebase(推送)消息传递的Angular2,如何获取令牌

时间:2018-04-20 10:11:14

标签: javascript angular firebase firebase-cloud-messaging

使用Angular2 Web应用程序(带有清单和NGSW服务工作者的PWA)我无法使Firebase消息传递正常工作。在请求令牌(firebase.messaging()。getToken())时,我得到:

  

消息传递/令牌订阅失败请求缺失   身份验证凭证

如果我使用@ angular / service-worker SwPush,我可以使用swPush.requestSubscription()获取PushSubscription。如果我在Firebase云功能中使用Node.js的Web Push库,我可以使用从swPush.requestSubscription()返回的订阅成功发送推送消息。

顺便说一句,在swPush.requestSubscription()中,我使用生成的公共VAPID,我也在Firebase控制台中注册Firebase以供使用。

所以无法正常工作 - Firebase消息传递,正常工作 - 使用网络推送进行swPush

Questing-1:使用Firebase消息传递是否有任何优势(因为我可以使用工作设置)?我想也许可以向主题发送推送通知(我还没有使用工作设置测试它)。

问题2:如果有优势,如何在尝试获取令牌时解决此错误,可能是什么原因?

失败的请求发送:

authorized_entity:  xxxxxxx
endpoint: https://fcm.googleapis.com/fcm/send/yyyyyyyy
encryption_key: zzzzzzzzzz
encryption_auth: qqqqqqqqqq

获得401

但是enpoint,key和auth正是我从工作的swPush.requestSubscription()得到的,所以Firebase设法发送正确的(我猜)订阅细节。然后在后端发生了什么?不知道authorized_entity是什么或做了什么,在文档中找不到任何对它的引用。也许某种程度上存在不匹配。

代码(主要是Firebase文档中的示例代码):

  pushSubscribeFB() {
    navigator.serviceWorker.getRegistration().then(swreg => {
      console.log('swreg with getregistration: ', swreg)
      if(swreg){
        firebase.messaging().useServiceWorker(swreg)
        firebase.messaging().requestPermission().then(function() {
          console.log('Notification permission granted.');
          firebase.messaging().getToken().then(function(currentToken) {
            if (currentToken) {
              console.log('token: ', currentToken)
              // sendTokenToServer(currentToken);
              // updateUIForPushEnabled(currentToken);
            } else {
              // Show permission request.
              console.log('No Instance ID token available. Request permission to generate one.');
              // Show permission UI.
              // updateUIForPushPermissionRequired();
              // setTokenSentToServer(false);
            }
          }).catch(function(err) {
            console.log('An error occurred while retrieving token. ', err);
            // showToken('Error retrieving Instance ID token. ', err);
            // setTokenSentToServer(false);
          });
        }).catch(function(err) {
          console.log('Unable to get permission to notify.', err);
        });
      }
    }).catch(err => console.log('could not get SW: ', err))
  }

0 个答案:

没有答案