【问题标题】:Firestore Admin Not Authenticating on Electron AppFirestore 管理员未在 Electron App 上进行身份验证
【发布时间】:2021-05-05 23:05:29
【问题描述】:

我正在创建一个电子应用程序作为管理员界面。目前使用实时数据库和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?

【问题讨论】:

  • 您是要将此添加到前端电子应用程序还是 node.JS 服务器上
  • 这是一个前端电子应用程序,但它是为管理员服务的,因此它需要管理员访问数据库才能读/写/更新等。管理 SDK 适用于实时数据库。

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


【解决方案1】:

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 实现一个服务帐户。

【讨论】:

  • 嗨,达拉斯,据我了解,如果我使用客户端 SDK,我将没有管理员权限?
  • 如果您授予该用户管理员访问权限,那么是的,他们可以拥有管理员访问权限。您需要为数据库配置安全规则并分配用户角色。
  • 当用户从客户端(电子应用程序)进行身份验证时,谷歌将验证他们从 firebase 的访问权限。你不必担心这一点。只需确保您已设置安全规则以确保其安全并为您的应用用户分配角色。
  • 这是否会扰乱我为 Realtime 设置管理员访问权限的方式?我是否也需要为此使用 JS SDK 并设置管理员权限?
  • 如果您希望管理员访问数据库。如果您想要一个服务帐户或总管理员访问权限。这需要在服务器而不是面向客户端的应用程序上实现。
猜你喜欢
  • 2011-09-18
  • 2013-07-10
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 2020-10-21
  • 2020-08-14
  • 2018-05-02
相关资源
最近更新 更多