initializeApp()中的Firebase Admin INVALID_APP_OPTIONS错误

时间:2017-09-30 16:18:02

标签: node.js firebase-admin

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

当我想将access_token与Firebase自定义令牌交换时,会出现问题。

我在Firebase管理页面上关注了Node.js的this guide,我正面临下面的错误消息

  

抛出新的错误_1.FirebaseAppError(error_1.AppErrorCodes.INVALID_APP_OPTIONS,"无效的Firebase应用选项作为" +

的initializeApp()的第一个参数传递      

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

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



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

5 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:3)

2017年5月在Firebase Admin Release Notes版本5.0.0时偶然发现,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 :(得分: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设置云功能时遇到了同样的错误消息。

传递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 ..因为到目前为止还没有在关于该参数的文档中看到它< / p>

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

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

  

现在可以在没有任何参数的情况下调用admin.initializeApp()方法。这会使用Google Application Default Credentials以及从FIREBASE_CONFIG环境变量加载的其他AppOptions初始化应用程序。

答案 3 :(得分:0)

请使用Firebase Admin SDK for Node.js中提到的以下代码段。从“项目设置”中的“服务帐户”下载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" });
select ac.Accountno
from Account ac
group by ac.Accountno
having min(ac.date) <> max(ac.date);

答案 4 :(得分:0)

检查您正在使用的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