Firebase Admin INVALID_APP_OPTIONS initializeApp() 错误

Firebase Admin INVALID_APP_OPTIONS error at initializeApp()

我正在尝试通过 Node.js 后端将 Instagram OAuth 连接到 Firebase。我已成功检索到 Instagram 帐户数据,包括 access_token,我想在我的 Node.js 后端与 firebase-admincreateCustomToken 进行交换。我的 objective 是为了生成自定义令牌,以便我的 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 passed as the first argument to initializeApp() for the " +

Error: Invalid Firebase app options passed as the first argument to initializeApp() for the app named "[DEFAULT]". The "credential" property must be an object which implements the Credential interface.

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

// 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 的连接,但我不知道解决方案,因为我是这些技术的初学者。请指教

刚刚在 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
});

Updated Answer

在继续使用它之后,它似乎能够调用 admin.initializeApp() 而无需任何参数,您需要确保您的 `/functions nodeJs 设置是最新。

/functions目录下,运行这个命令:

npm i --save firebase-functions@latest

感谢:

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

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

First Answer

我 运行 在尝试为 Firebase 设置 Cloud Functions 时出现相同的错误消息。

传递 admin.initializeApp 的参数为我的项目解决了它:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

经过大量搜索,很高兴地找到了这个带有 post 的线程,其中包含那行代码:https://github.com/firebase/firebase-functions/issues/99 .. 因为到目前为止还没有在文档中的任何地方看到它关于那个参数

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

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

The admin.initializeApp() method can now be invoked without any arguments. This initializes an app using Google Application Default Credentials, and other AppOptions loaded from the FIREBASE_CONFIG environment variable.

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

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

有关详细信息,请参阅此 GitHub page

请使用以下代码段,它在 Node.js 的 Firebase Admin SDK 中提到。从项目设置中的服务帐户下载 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"
});

检查您使用的是哪个版本的 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