从自托管服务器访问 Firestore

时间:2021-07-03 10:21:16

标签: firebase google-cloud-firestore

我需要能够从我的自托管服务器(不在 gcloud 上)访问(读取、写入)firestore。

我还需要保留对托管在我的自托管服务器上的应用程序的写入权限,并允许其他人无法写入服务器,因此默认情况下拒绝写入应用程序的安全规则。

根据该文件: https://firebase.google.com/docs/firestore/client/libraries#server_client_libraries

使用服务帐户应该能让我不受任何限制地访问所有 Firebase 产品,包括 Firestore。

但是,一旦我限制了安全规则,我就无法从我的服务写入 Firestore,并按照本文档中的步骤使用服务帐户凭据进行实例化: https://firebase.google.com/docs/admin/setup#initialize-sdk

我收到以下错误: PERMISSION_DENIED: Missing or insufficient permissions.

我需要做什么才能让我的应用程序从我自己的服务器写入 Firestore?

更新: 我在后端应用程序中使用 java。

2 个答案:

答案 0 :(得分:0)

服务器(或云功能)是安全的环境,只有您和您授权的人才能访问。您实际上并未在服务器中使用 Firebase Client SDKs。相反,您使用 Firebase Admin SDK。它使用 service account 并有权访问您的 Firebase 项目。

特权访问是什么意思?

documentation 已经解释了一切,但长话短说,它可以像您一样完全访问项目。它不遵循任何安全规则。

如果您正在实施 Admin SDK,它将处理来自您的客户的 API 请求,请确保您对它们进行身份验证。为此,您最好将 Firebase ID 令牌从前端传递到 API 并verify 它使用 Admin SDK 返回一个 decoded token 对象,其中包含 UID、自定义声明和有关该用户的一些元数据。

我不确定您使用哪种语言,但这里有一个简单的 NodeJS 入门:

// Install the Admin SDK
npm install firebase-admin
// index.js

const admin = require("firebase-admin")

const path = require("path");

admin.initializeApp({
  credential: admin.credential.cert("path/to/key")),
  databaseURL: "https://<project-id>.firebaseio.com/"
})

const firestore = admin.firestore()
const auth = admin.auth()

// firebase.firestore() and firebase.auth() in client SDKs

其余语法与 Client SDK 基本相同。

您可以从项目设置中创建服务帐户。

enter image description here

答案 1 :(得分:0)

我所面临的问题已在此处报告:

https://github.com/googleapis/java-firestore/issues/431

这个修复很奇怪,如果不深入研究 SDK 及其工作原理就无法解释,我没有时间检查:

enter image description here