Firestore 管理员未在电子应用程序上进行身份验证

Firestore Admin Not Authenticating on Electron App

我正在创建一个电子应用程序作为管理员的界面。当前使用实时数据库和 firestore。我正在使用带有本地 .json 服务帐户文件的 firebase admin sdk 连接到实时数据库并执行所有不受限制的 read/write 操作。一切都按预期工作。但是,当尝试 read/write 到 Firestore 数据库时,我收到一个错误:

You need to pass auth instance to use gRPC-fallback client in browser. Use OAuth2Client from google-auth-library.

我在网上看到其他人也有类似的问题,我尝试了以下方法:

不幸的是,我仍然得到同样的回复。我也收到了很多如下的警告信息(每个都引用了不同的js文件),不确定它们是否相关:

DevTools failed to load SourceMap: Could not parse content for file:///Users/anaroca/Desktop/FCF-Admin/node_modules/@google-cloud/firestore/build/src/pool.js.map: Unexpected end of JSON input

这是我启动管理应用程序的方式:

var admin = require("firebase-admin");
var serviceAccount = require("./secret.json");
app = admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://project-name.firebaseio.com",
  projectId: 'project-name'
});

感谢任何帮助。

编辑:从达拉斯得到答案后,我发现这个 Whosebug 是解决我的问题的一个非常优雅的方法。

Firestore 是新的,因此与实时存在一些差异。

如果您希望在 electron、react 或其他前端框架中实现,您需要使用 JavaScript SDK

如果您希望使用 Node.JS、c# 等在安全服务器上实施 Firestore,您需要使用 Admin SDK.

这就是我使用电子实现的方式。创建一个 firebase.js 文件。如果要使用最新的语法,请使用 babel 进行转译。

import firebase from 'firebase/app';
import 'firebase/firestore';

const firebaseConfig = {
  apiKey: 'key',
  authDomain: 'domain.firebaseapp.com',
  databaseURL: 'https://domain.firebaseio.com',
  projectId: 'project1234',
  storageBucket: 'myapp.appspot.com',
  messagingSenderId: '123456789',
  appId: 'ID',
  measurementId: 'MID',
};

firebase.initializeApp(firebaseConfig);

export const firestore = firebase.firestore();

export default firebase;

然后在您需要访问数据库的任何地方执行此操作

// The firebase.js file you created earlier.
import { firestore } from './firebase';

    const getPost = async (poss) => {
      const snapshot = await firestore.collection('location/of/post').get();
      const myPosts = snapshot.docs.map(collectIdsAndDocs);
      return myPosts;
    };

    const createPost = async (post) => {
      const docRef = await firestore.collection('location/of/post').add(post);
      const doc = await docRef.get();
      return doc;
    };

    createPost({ Title: 'My First Post', Content: 'My content' });
    getPost();

要保护数据库并授予管理员权限,请转到项目设置并分配用户角色。如果您的服务器可以清理旧数据或用户或用于其他自治目的,则您只需要使用 Admin-SDK 实施服务帐户。