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