Firestore 管理员未对 Electron 应用进行身份验证

时间:2021-05-05 23:05:29

标签: javascript firebase google-cloud-firestore electron-forge

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

<块引用>

您需要传递 auth 实例才能在浏览器中使用 gRPC-fallback 客户端。使用 google-auth-library 中的 OAuth2Client。

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

  • npm 重建
  • 安装@grcp/grcp 包
  • 安装 google-auth-library

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

<块引用>

DevTools 无法加载 SourceMap:无法解析 file:///Users/anaroca/Desktop/FCF-Admin/node_modules/@google-cloud/firestore/build/src/pool.js.map 的内容:意外结束JSON 输入

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

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'
});

感谢任何帮助。

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

How to use Admin SDK with limited privileges on Firestore?

1 个答案:

答案 0 :(得分:0)

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 实施服务帐户。