firebase 无法确定项目 ID

5 node.js firebase-authentication firebase-admin

这是我使用节点发出的请求


// Initialize the default app
var admin = require('firebase-admin');

var app = admin.initializeApp({
  credential: admin.credential.applicationDefault(),
  databaseURL: process.env.FIREBASE_DATABASE
});

console.log(process.env.FIREBASE_DATABASE);


router.post('/', (req, res, next) => {

    app.auth().getUserByEmail("j.100233260@gmail.com")
    .then(function(userRecord) {
            // See the UserRecord reference doc for the contents of userRecord.
            console.log('Successfully fetched user data:', userRecord.toJSON());
            res.json(userRecord.toJSON())
        })
        .catch(function(error) {
                console.log('Error fetching user data:', error);
                res.json(error)

            });

        }

        );
Run Code Online (Sandbox Code Playgroud)

我在我的机器上设置了环境变量

在此输入图像描述

对于我的 firebase 数据库,我使用了 env

在此输入图像描述

给出为

databaseURL: "https://fssssss.firebaseio.com",
Run Code Online (Sandbox Code Playgroud)

从 Firebase 管理 GUI 中,

当我请求这条路线时邮递员中的错误

{
    "code": "app/invalid-credential",
    "message": "Failed to determine project ID: Error while making request: getaddrinfo ENOTFOUND metadata.google.internal metadata.google.internal:80. Error code: ENOTFOUND"
}
Run Code Online (Sandbox Code Playgroud)

我按照文档进行操作,谷歌没有返回任何结果,不知道该怎么办。谢谢。

小智 10

方法一(推荐):

const firebase_admin = require('firebase-admin');
const admin = firebase_admin.initializeApp({
    credential: firebase_admin.credential.applicationDefault()
});
Run Code Online (Sandbox Code Playgroud)

然后像这样运行应用程序:

GOOGLE_APPLICATION_CREDENTIALS=/path/to/yourserviceaccountkey.json node index.js
Run Code Online (Sandbox Code Playgroud)

或者通过 package.json 脚本:

"start" : "GOOGLE_APPLICATION_CREDENTIALS=/path/to/yourserviceaccountkey.json node index.js"
Run Code Online (Sandbox Code Playgroud)

您还可以在运行 Node 之前在终端会话中设置环境变量,如下所示:

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"
Run Code Online (Sandbox Code Playgroud)

方法 2(安全性较低):

只需传递您的服务帐户密钥的路径

const firebase_admin = require('firebase-admin');
const serviceAccount = require("/path/to/yourserviceaccountkey.json");
const admin = firebase_admin.initializeApp({
  credential: firebase_admin.credential.cert(serviceAccount);
});
Run Code Online (Sandbox Code Playgroud)

参考


Dou*_*son 7

这没有按您期望的方式工作:

admin.credential.applicationDefault()
Run Code Online (Sandbox Code Playgroud)

如果没有额外的配置,您无法在您控制的服务器上使用它。仅当您要在项目中使用默认服务帐户时,这仅在 Google 服务上运行时才有效。在您自己的服务器上运行时,没有默认值。您必须明确并下载服务帐户凭据以在初始化期间使用。至少,您需要遵循文档中的说明:

要对服务帐户进行身份验证并授权其访问 Firebase 服务,您必须生成 JSON 格式的私钥文件。

要为您的服务帐户生成私钥文件:

  • 在 Firebase 控制台中,打开设置 > 服务帐户。
  • 单击“生成新私钥”,然后单击“生成密钥”进行确认。
  • 安全地存储包含密钥的 JSON 文件。

通过服务帐户授权时,您有两种选择向应用程序提供凭据。您可以设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量,也可以在代码中显式传递服务帐户密钥的路径。第一个选项更安全,强烈推荐。

因此,您需要下载服务帐户文件,正确设置 GOOGLE_APPLICATION_CREDENTIALS,然后您的代码才能工作。服务帐户凭据不是可选的。