【问题标题】:Firebase Admin INVALID_APP_OPTIONS error at initializeApp()在 initializeApp() 出现 Firebase 管理员 INVALID_APP_OPTIONS 错误
【发布时间】:2018-03-12 07:02:49
【问题描述】:

我正在尝试通过 Node.js 后端将 Instagram OAuth 连接到 Firebase。我已成功检索到 Instagram 帐户数据,包括我想在我的 Node.js 后端与 firebase-admincreateCustomToken 交换的 access_token。我的目标是生成自定义令牌,以便我的 Angular 应用程序可以在我的 Firebase 应用程序中执行 signInWithCustomToken(token)。从 Instagram 检索数据没有问题,因为我可以在控制台上打印我的 JSON 对象。

当我想将我的access_token 交换为 Firebase 自定义令牌时出现问题。

我已从 Node.js 的 Firebase 管理页面关注 this guide,但我在下方遇到错误消息

throw new error_1.FirebaseAppError(error_1.AppErrorCodes.INVALID_APP_OPTIONS, "Invalid Firebase app options 作为第一个参数传递给 " +

错误:无效的 Firebase 应用选项作为名为“[DEFAULT]”的应用的 initializeApp() 的第一个参数传递。 “凭据”属性必须是实现凭据接口的对象。

这是我在相关问题上的代码。

// authService.js

var fbAdmin = require('firebase-admin');
var serviceAccount = require('./key/key.json');

function createFirebaseToken(instagramID) {

        // I copy & pasted this var from other class
        var config = {
            apiKey: "MY_FIREBASE_APIKEY",
            authDomain: "MY_APP.firebaseapp.com",
            databaseURL: "https://MY_APP.firebaseio.com",
            storageBucket: "MY_APP.appspot.com",
        };

        console.log(fbAdmin.credential.cert(serviceAccount)); // serviceAccount successfully printed on console

        // Error appears when executing this function
        fbAdmin.initializeApp({
            serviceAccount: fbAdmin.credential.cert(serviceAccount),
            databaseURL: config.databaseURL
        });

        const uid = `instagram:${instagramID}`;
      
        // Create the custom token.
        console.log(uid);
        return fbAdmin.auth().createCustomToken(uid);
    }

我的 Node 应用程序似乎无法初始化与 firebase-admin 的连接,但我不知道解决方案,因为我是这些技术的初学者。请指教。

【问题讨论】:

    标签: node.js firebase-admin


    【解决方案1】:

    刚刚在 2017 年 5 月的 5.0.0 版中偶然发现 Firebase Admin Release Notes 表示 serviceAccount 已被删除。所以我没有强制使用serviceAccount,而是使用credential

    fbAdmin.initializeApp({
      credential: fbAdmin.credential.cert({
          projectId: '<APP_ID>',
          clientEmail: "foo@<APP_ID>.iam.gserviceaccount.com",
          privateKey: "-----BEGIN PRIVATE KEY-----\n<MY_PRIVATE_KEY>\n-----END PRIVATE KEY-----\n"
        }),
      databaseURL: config.databaseURL
    });

    【讨论】:

      【解决方案2】:

      更新答案

      继续处理后,它似乎可以在没有任何参数的情况下调用admin.initializeApp(),您需要确保您的 `/functions nodeJs 设置是最新的。

      /functions 目录中,运行以下命令:

      npm i --save firebase-functions@latest

      感谢: https://stackoverflow.com/a/49437619/2162226

      .. 我仍然熟悉所有 nodeJS/npm 细节 - 不知道为什么,但似乎我必须运行它几次才能让一切到位。那和sudo npm install -g firebase-tools 也更新了。

      根据官方文档,我们需要至少使用 Firebase 4.12.0 版本才能获得最新的云功能支持:https://firebase.google.com/docs/functions/callable

      第一个答案

      我在尝试为 Firebase 设置 Cloud Functions 时遇到了相同的错误消息。

      传入admin.initializeApp 的参数为我的项目解决了这个问题:

      const functions = require('firebase-functions');
      const admin = require('firebase-admin');
      
      admin.initializeApp(functions.config().firebase);
      

      经过大量搜索,感激地找到了这个帖子,其中有一个帖子,其中包含该行代码:https://github.com/firebase/firebase-functions/issues/99 .. 因为到目前为止,在有关该参数的文档中还没有看到它

      根据 2018 年 1 月 11 日的发布文档:

      https://firebase.google.com/support/release-notes/admin/node

      现在可以在不带任何参数的情况下调用 admin.initializeApp() 方法。这将使用 Google 应用程序默认凭据和从 FIREBASE_CONFIG 环境变量加载的其他 AppOptions 初始化应用程序。

      【讨论】:

        【解决方案3】:

        可以通过将 firebase-tools、firebase-functions 和 firebase-admin 软件包更新到最新版本来解决此问题。

        npm install -g firebase-tools@latest
        npm install firebase-functions@latest
        npm install firebase-admin@latest
        

        更多详情请参考GitHub page

        【讨论】:

          【解决方案4】:

          请使用 Firebase Admin SDK for Node.js 中提到的以下 sn-p。从项目设置中的服务帐户下载 JSON 文件并更改 serviceAccount 中的路径。还要添加您的databaseUrl,其格式为http://app_name/.firebaseio.com

          var admin = require("firebase-admin");
          
          var serviceAccount = require("path/to/serviceAccountKey.json");
          
          admin.initializeApp({
            credential: admin.credential.cert(serviceAccount),
            databaseURL: "yourDatabaseUrl"
          });
          

          【讨论】:

            【解决方案5】:

            检查您使用的 firebase-admin 模块的版本。 根据版本 5.9.1 的发行说明 The admin.initializeApp() method can now be invoked without a credential option. The SDK uses Google Application Default Credentials when initialized this way.

            release notes

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-06
              • 1970-01-01
              • 2014-03-25
              • 1970-01-01
              • 2020-09-17
              • 1970-01-01
              相关资源
              最近更新 更多