我对Firestore的安全规则有疑问。
我的情况是这样的:一个Android应用程序,用户将仅读取数据。他们不会保存,也不会修改任何内容。他们不会注册。只是数据读取。
就我而言,我需要在那个集合中写东西。我计划使用API KEY通过cURL进行此操作。
我使用的规则如下:
match /mycol/{document=**} {
allow read: if request.auth.uid != null; allow write: if true;
}
我想阻止我的收藏集被访问,例如通过URL从任何地方访问:
https://firestore.googleapis.com/v1/projects/myproject/databases/(default)/documents/mydoc/mycol/
例如,避免漫游器发出不加选择的请求,这会使我的账单膨胀...
在这种情况下,我正在实施良好的规则(仅从Android应用中读取而不进行身份验证,并使用API KEY通过cURL进行写入)?
答案 0 :(得分:1)
由于您尝试尝试仅读取和仅写入某些条件的特定内容,请尝试使用此规则。在条件内指定api键(如果有):
service cloud.firestore {
match /databases/{database}/documents {
match /<some_path>/ {
allow read: if <some_condition>;
allow write: if <some_condition>;
}
}
}
要仅将应用定位为目标,只需执行以下操作即可获取应用令牌:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(this, instanceIdResult -> {
String newToken = instanceIdResult.getToken();
Log.e("newToken", newToken);
});
运行此代码后,进入日志,然后复制令牌,然后在您的条件内指定该令牌,以尝试使用您的应用程序令牌创建auth id,然后在数据库规则中将该auth id与您的应用程序令牌进行比较
答案 1 :(得分:1)
您并没有真正关闭您的收藏集,相反,您允许任何人对其进行写信。
要仅允许您自己写入集合,有几个选项。您可以使用Admin SDK并编写一个仅在计算机上运行的小程序。
Admin SDK具有安全性,因此您可以删除写入部分,它仅对您有用。
match /mycol/{document=**} {
allow read: if request.auth.uid != null;
}
这可能是最简单的选择,而且很安全,只要您保持凭据安全,并且仅在受信任的计算机/网络中进行即可。
另一种选择是为自己创建一个用户并向该用户进行身份验证。例如,可以是移动应用程序,Web应用程序或Node应用程序。这样,您可以为您的用户创建自定义声明,并且仅允许具有该声明的用户进行写,如下所示:
match /mycol/{document=**} {
allow read: if request.auth.uid != null; allow write: if request.auth.token.admin;
}
然后您可以像这样(从Node)向用户设置声明:
await admin.auth().setCustomUserClaims("user_user_id", { admin: true });
另一个选择是创建一个Cloud Function以写入该集合。 Cloud Functions使用Admin SDK,因此除非您希望通过使用Javascript客户端SDK来使用它们,否则安全规则也将不适用。然后,在Cloud Function中,您可以验证您的API密钥,并且总是调用Cloud Function的URL,而不是直接调用数据库。
我会选择第一个选项,这样您就可以熟悉Admin SDK,然后如果需要,可以升级到更结构化的解决方案。