问题描述
我正在尝试使用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)
self.client.collection("Users").document("user_1").set(...)
这一切都成功了,这是出乎意料的。我禁止所有写操作,但是我只执行了一次写操作,并且Firestore仿真器成功地承认规则在以下方面生效:
[info] ✔ firestore: Rules updated.
我终于遇到Get started with Cloud Firestore Security Rules,其中指出:
服务器客户端库绕过所有Cloud Firestore安全规则,而是通过Google应用程序默认凭据进行身份验证。
真的没有办法修改self.client
或firebase_app
使得上述写入失败吗?我无法想象只有客户端(如在iOS / Android设备上)才支持这种身份验证。该页面继续:
如果您使用的是服务器客户端库或REST或RPC API,请确保为Cloud Firestore设置身份和访问管理(IAM)。
但是根据我的实际安全规则,我试图将访问权限限制为仅对某些集合/文档进行访问,而IAM似乎仅覆盖诸如createDocument
之类的全局权限。
解决方法
仅documentation中所述,使用“ @ firebase / testing”模块的nodejs应用程序仅支持使用仿真器测试安全规则:
使用
@firebase/testing
模块与本地运行的仿真器进行交互。
使用此模块,您可以初始化SDK以提供用户信息,这些信息将传递给仿真器以用于特定的测试规则。
如果要使用python,则必须对模块的功能进行反向工程,并将其写入您自己的测试代码中。这可能比学习足够的JavaScript来执行记录的测试要付出更多的努力。