【问题标题】:"Request is missing authentication credential" error when calling firebase.messaging.getToken()调用 firebase.messaging.getToken() 时出现“请求缺少身份验证凭据”错误
【发布时间】:2019-09-12 00:14:29
【问题描述】:

我正在关注tutorial 向网络应用程序添加推送通知,包括使用 VAPID 密钥调用firebase.messaging.usePublicVapidKey。但是,当我打电话给getToken 时,我收到以下错误:

请求缺少所需的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据。见https://developers.google.com/identity/sign-in/web/devconsole-project

我已经在使用 VAPID 密钥,并且 Google 在教程中没有说过需要 Google OAuth 登录。我该如何解决这个问题?

 var messaging = firebase.messaging();
 messaging.usePublicVapidKey('redacted');

 function obtenerToken() {
         messaging.getToken().then(function (nuevoToken) {
                if (nuevoToken) {
                    token = nuevoToken;
                } else {
                    messaging.requestPermission().then(obtenerToken)
                        .catch(function (err) { console.log('La web no tiene permiso para recibir notificaciones ', err); });
                }
            }).catch(function (err) { console.log('Error al obtener token de Firebase ', err); });
        }
        obtenerToken();

【问题讨论】:

    标签: javascript firebase firebase-cloud-messaging


    【解决方案1】:

    您是否使用 Firebase 配置对象进行了初始化?

    import firebase from "firebase/app";
    import "firebase/messaging";
    
    const firebaseConfig = {
      apiKey: "api-key",
      authDomain: "project-id.firebaseapp.com",
      databaseURL: "https://project-id.firebaseio.com",
      projectId: "project-id",
      storageBucket: "project-id.appspot.com",
      messagingSenderId: "sender-id",
    };
    
    if (!firebase.apps.length) {
      firebase.initializeApp(firebaseConfig);
    }
    
    let messaging;
    try {
      messaging = firebase.messaging();
      messaging.usePublicVapidKey("publicVapidKey");
    } catch (e) {
      messaging = null;
    }
    

    您是否在 Google Developer Console 中为浏览器 API 密钥和客户端 ID 设置了生产域白名单?

    您是否设置了 firebase-messaging-sw.js 文件?

    像这样。

    // change your using firebase version
    importScripts("https://www.gstatic.com/firebasejs/5.10.0/firebase-app.js");
    importScripts("https://www.gstatic.com/firebasejs/5.10.0/firebase-messaging.js");
    
    const messagingSenderId = "your sender id here";
    firebase.initializeApp({ messagingSenderId });
    
    try {
      const messaging = firebase.messaging();
    } catch (e) {}
    

    见:

    如果不起作用,那么您应该尝试quickstart

    【讨论】:

    • 现在我正在使用 localhost 进行测试。是的,我打电话给firebase.initializeApp
    • 您是否设置了 firebase-messaging-sw.js 文件?如果不起作用,那么您应该尝试quickstart
    • 我尝试了快速入门。我没有收到错误并正常工作。尝试重新生成密钥对并复制公钥并设置。打开项目控制台页面并转到项目设置 > 云消息传递,然后在 Web 配置部分中。
    【解决方案2】:

    设法解决了这个问题。原来我从一个项目复制了配置,从另一个项目复制了 VAAPI 密钥。哦!

    【讨论】:

      【解决方案3】:

      清除您的网站数据!

      在为此苦苦挣扎了一段时间后,我清除了我的站点数据,并且身份验证错误不再发生。我们使用带有自定义身份验证令牌的 Firestore 来检索站点另一部分的实时数据,我怀疑它会导致问题。

      【讨论】:

        【解决方案4】:

        出于不同的原因,我遇到了同样的问题。我们正在使用两个 Firebase 项目(一个开发,一个生产)。这两个应用程序配置在同一个配置文件中。我刚刚了解到 firebase.messaging() 函数可以接受一个参数:初始化的 Firebase App。如果没有此参数,则 const devMessaging 使用默认应用程序设置进行配置,在我的情况下为生产。这是固定的代码:

        export const app = firebase.initializeApp(config);
        export const devApp = firebase.initializeApp(devConfig, "secondary");
        
        const devMessaging = firebase.messaging(devApp);
        devMessaging.usePublicVapidKey("this_is_private");
        
        devMessaging.getToken().then(() => {
          // continue with the rest of the code 
        });
        
        

        资源:https://firebase.google.com/docs/reference/js/firebase.messaging

        【讨论】:

          猜你喜欢
          • 2014-05-08
          • 2015-06-01
          • 2018-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-05
          • 1970-01-01
          • 2021-09-24
          相关资源
          最近更新 更多