首页 > 解决方案 > 在 Node js 上初始化 Firestore Admin SDK 时出现身份验证错误

问题描述

我正在尝试使用节点 js 构建一个服务器,该服务器处理来自客户端的数据并将其上传到 Firestore。我还是新人。这是我的服务器的代码:

const express = require('express');
const multer = require('multer');
const path = require('path');
const admin = require('firebase-admin');

let app = express();

let upload = multer();

let serviceAccount = require('./psylocke-774e2adbf0e5.json');

admin.initializeApp({
    credentials: admin.credential.cert(serviceAccount)
}); 

let db = admin.firestore();

let port = process.env.PORT || 8000;

app.route('/interface').get((_, res) => {
    try {
        res.sendFile(__dirname + '/interface.html');
    } catch (e) {
        res.status(404).send(e.message);
    }
})

app.post('/upload', upload.any(), (req, res) => {
    let test = {
        name:'juan',
        age:15
    };
    db.collection('roots').doc('sampleroot').set(test).then((mess) => {
        console.log("I went through hwere");
        res.send('it worked');
    }).catch((err) => {
        res.send('it didnt work');
        console.log(err);
    });
})

app.listen(port, () => console.log(`Server running on port ${port}`));

这是我的项目 JSON 文件(我必须从谷歌云平台下载):

{
  "type": "service_account",
  "project_id": "psylocke",
  "private_key_id": "<id>",
  "private_key": "<private key>",
  "client_email": "firebase-adminsdk-ja1c3@psylocke.iam.gserviceaccount.com",
  "client_id": "113260833969613996508",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-ja1c3%40psylocke.iam.gserviceaccount.com"
}

我收到以下错误:

Error: Unable to detect a Project Id in the current environment.
To learn more about authentication and Google APIs, visit:
https://cloud.google.com/docs/authentication/getting-started

我收到这个错误很奇怪,因为项目 ID 实际上是在 json 文档中指定的。有谁知道发生了什么?

标签: node.jsfirebasegoogle-cloud-firestore

解决方案


这是因为 Firestore。在 initializeApp 上有一个选项可以传入您需要执行的 projectID。Firestore 与 IAM 的集成还不足以(还)从服务帐户中提取,特别是因为服务帐户可以(并且经常)指向其他项目,因此您可能不一定希望它这样做。

检查此文档:https ://firebase.google.com/docs/reference/node/firebase了解您可以传递给该初始化调用的选项。例如:

// Initialize default app
// Retrieve your own options values by adding a web app on
// https://console.firebase.google.com
firebase.initializeApp({
  apiKey: "AIza....",                             // Auth / General Use
  appId: "1:27992087142:web:ce....",              // General Use
  projectId: "my-firebase-project",               // General Use
  authDomain: "YOUR_APP.firebaseapp.com",         // Auth with popup/redirect
  databaseURL: "https://YOUR_APP.firebaseio.com", // Realtime Database
  storageBucket: "YOUR_APP.appspot.com",          // Storage
  messagingSenderId: "123456789",                 // Cloud Messaging
  measurementId: "G-12345"                        // Analytics
});

推荐阅读