Firestore哪个规则只能从Android应用程序读取并使用API​​ KEY写入?

时间:2019-02-25 10:57:25

标签: android firebase google-cloud-firestore

我对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进行写入)?

2 个答案:

答案 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,然后如果需要,可以升级到更结构化的解决方案。