【问题标题】:Accessing firestore from self-hosted server从自托管服务器访问 Firestore
【发布时间】:2021-07-03 10:21:16
【问题描述】:

我需要能够从我的自托管服务器(不在 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。

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

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

    特权访问是什么意思?

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

    如果您正在实施将处理来自您的客户端的 API 请求的 Admin SDK,那么请确保您对它们进行身份验证。为此,您最好将 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 基本相同。

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

    【讨论】:

      【解决方案2】:

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

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

      修复是一个奇怪的修复,如果不深入了解 SDK 及其工作原理就无法解释,我没有时间检查:

      【讨论】:

        猜你喜欢
        • 2019-08-04
        • 2011-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-07
        • 1970-01-01
        • 2011-11-01
        相关资源
        最近更新 更多