如何将安全规则从Python的服务器客户端库集成到Firestore客户端中?

问题描述

我正在尝试使用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之类的全局权限。

解决方法

documentation中所述,使用“ @ firebase / testing”模块的nodejs应用程序仅支持使用仿真器测试安全规则:

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

使用此模块,您可以初始化SDK以提供用户信息,这些信息将传递给仿真器以用于特定的测试规则。

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