【问题标题】:How to integrate security rules into Firestore client from Python's server client library?如何将安全规则从 Python 的服务器客户端库集成到 Firestore 客户端?
【发布时间】:2020-12-07 01:40:06
【问题描述】:

我正在尝试使用 Firestore 模拟器测试我的安全规则。我做了一个firestore.rules 禁止所有读写的安全规则:

service cloud.firestore {
    match /databases/{database}/documents {
        allow read, write: if false;
    }
}

我从终端启动了 Firestore 模拟器:

firebase emulators:start --only firestore

然后我初始化了我的 Firestore 客户端:

import firebase_admin
from firebase_admin import firestore

firebase_app = firebase_admin.initialize_app()
self.client = firestore.client(app=firebase_app)

我在 Firestore 模拟器的数据库中添加了一个示例文档:

self.client.collection("Users").document("user_1").set(...)

这一切都成功了,这是出乎意料的。我禁止了所有写入,但我只执行了一次,Firestore 模拟器成功确认规则生效:

[info] ✔  firestore: Rules updated.

我终于遇到了Get started with Cloud Firestore Security Rules,它说:

服务器客户端库绕过所有 Cloud Firestore 安全规则,而是通过 Google 应用程序默认凭据进行身份验证。

真的没有办法修改self.clientfirebase_app 使得上面的写入失败吗?我无法想象这种类型的身份验证仅受客户端支持(如在 iOS/Android 设备上)。页面继续:

如果您使用服务器客户端库或 REST 或 RPC API,请确保为 Cloud Firestore 设置身份和访问管理 (IAM)。

但根据我的实际安全规则,我试图限制对某些集合/文档的访问,而 IAM 似乎只涵盖全局权限,例如 createDocument

【问题讨论】:

    标签: python firebase google-cloud-firestore firebase-authentication firebase-security


    【解决方案1】:

    只有使用 documentation 中所述的“@firebase/testing”模块的 nodejs 应用才支持使用模拟器测试安全规则:

    使用@firebase/testing 模块与本地运行的模拟器进行交互。

    使用此模块,您可以初始化 SDK 以提供将交付给模拟器的用户信息,用于测试规则的特定目的。

    如果您想改用 python,则必须对该模块的功能进行逆向工程,并将其写入您自己的测试代码中。这可能比学习足够多的 JavaScript 来执行记录的测试更费力。

    【讨论】:

    • 感谢您对文档的澄清。我将在 JS 中编写测试,但要澄清一下:如果将安全规则部署到生产环境中,并且我从 Python 客户端库连接到生产 Firestore 数据库,那么编写最终会失败吗?我链接的关于绕过安全规则的客户端库的引用使这有点令人困惑。还是我也要用JS写生产代码?
    • 服务器 SDK 总是绕过安全规则。规则仅适用于使用为这些平台提供的 SDK 的 Web 和移动客户端。
    猜你喜欢
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多