Firestore对于Android应用程序的只读和使用API密钥的写入,使用哪条规则?

Firestore对于Android应用程序的只读和使用API密钥的写入,使用哪条规则?,android,firebase,google-cloud-firestore,Android,Firebase,Google Cloud Firestore,我对Firestore的安全规则有疑问 我的场景是这样的:一个Android应用程序,用户将只读取数据。它们不会保存,也不会修改任何内容。他们不打算注册。这只是数据读取 一、 就我而言,我需要在这个集合中写作。我计划通过使用API键的cURL来实现 我使用的规则如下: match /mycol/{document=**} { allow read: if request.auth.uid != null; allow write: if true; } 我想阻止从任何地方访问我的收藏

我对Firestore的安全规则有疑问

我的场景是这样的:一个Android应用程序,用户将只读取数据。它们不会保存,也不会修改任何内容。他们不打算注册。这只是数据读取

一、 就我而言,我需要在这个集合中写作。我计划通过使用API键的cURL来实现

我使用的规则如下:

  match /mycol/{document=**} {
  allow read: if request.auth.uid != null; allow  write: if true;
}
我想阻止从任何地方访问我的收藏,例如通过URL:

https://firestore.googleapis.com/v1/projects/myproject/databases/(默认)/文档/mydoc/mycl/

例如,避免机器人不分青红皂白地发出会使我的账单膨胀的请求


我正在为这种情况实施好的规则(仅从Android应用程序读取而不进行身份验证,并使用API密钥通过cURL写入)?

因为您试图针对特定条件进行只读和只写。请尝试使用此规则。在此条件内指定api密钥(如果有):

   service cloud.firestore {
      match /databases/{database}/documents {
        match /<some_path>/ {
          allow read: if <some_condition>;
         allow write: if <some_condition>;
}
      }
    } 

运行此代码后,转到您的日志,然后复制令牌,然后在您的条件中简单地指定该令牌,然后尝试使用应用程序令牌创建一个身份验证id,然后将该身份验证id与数据库规则中的应用程序令牌相比较。相反,您并没有真正关闭收藏,你允许任何人给它写信

要仅允许您自己写入集合,有几个选项。您可以使用并编写一个只在您的计算机上运行的小程序

AdminSDK保护了安全性,因此您可以删除写入部分,它只对您有效

match /mycol/{document=**} {
  allow read: if request.auth.uid != null;
}
这可能是最简单的选择,也是安全的,只要您保证您的凭据安全,并且只在受信任的机器/网络中执行此操作

另一个选项是为自己创建一个用户并与该用户进行身份验证。例如,可以是移动应用程序、web应用程序或节点应用程序。通过这样做,您可以为您的用户创建自定义声明,并且只允许具有该声明的用户进行写入,如下所示:

match /mycol/{document=**} {
  allow read: if request.auth.uid != null; allow write: if request.auth.token.admin;
}
然后,您可以像这样(从节点)向用户设置声明:

另一个选择是创建一个云函数来写入该集合。云函数使用ADMINSDK,因此安全规则也不适用,除非您希望使用Javascript客户端SDK。然后在云函数中,您可以验证API密钥,并且始终调用云函数的URL,而不是直接调用数据库


我会选择第一个选项,这样您就可以熟悉Admin SDK,然后如果需要,您可以升级到更结构化的解决方案。

谢谢。我的问题正是关于条件。1.什么条件可以只从应用程序中读取而不需要用户注册?2.什么条件允许我只使用API密钥进行写入和访问?请检查我的更新答案,如果你仍然没有得到它,请给我回电话,我会告诉你执行代码的步骤。对不起,但我不太明白你告诉我的关于令牌的内容。这是不是每次对Firebase都有额外的请求?这不会使我的账单膨胀吗?难道没有更简单的方法吗?令牌是firebase生成的唯一标识,用于识别特定的应用程序,因此当您获取应用程序生成的令牌并在规则中指定时,默认情况下仅允许您的应用程序访问该令牌database@A.Cedano这是最简单的解决方案如果您希望您的应用程序只访问数据库,而且我认为除此之外,没有任何其他解决方案能够实现您想要的汉克斯·里卡多,则会出现问题。我对安全规则感到困惑。只保留以下内容:
match/mycl/{document=**}{allow read:if request.auth.uid!=null;}
,我在我的日志中看到这条消息:
com.google.firebase.firestore.FirebaseFirestoreException:权限\u被拒绝:权限缺失或不足
我不明白应用什么规则只允许从Android读取。您的规则仅限于经过身份验证的用户。解决这一问题的一种方法是在Android上创建匿名登录:,或者您也可以通过将规则设置为“仅允许读取”
allow read只保护写操作。如果我离开
允许读取如果机器人不加选择地向该路径中我的收藏/文档的URL发送请求,会发生什么情况?我想准确地避免在我的账单中出现意外是的,那将是一个问题。也许在这种情况下,创建一个具有固定密码的单个用户并使用它进行身份验证会更有趣。只有当你的密码泄漏时才会出现问题,但有办法缓解这一问题,例如创建当前日期的哈希并将其用作密码。在谷歌控制台上看到我有Android客户端的凭据,我不能在Firestore中永久授权我的应用程序?事实上,我认为Firestore应该以一种简单的方式识别我的应用程序,但我不知道应该应用什么规则来实现这一点。那么,当我将Firestore添加到Android应用程序时,控制台中创建的凭据有什么用呢?你不能使用安全规则来限制Firestore的流量来源。它可能来自Android应用程序、iOS、web或RESTAPI。您可以根据访问数据的经过身份验证的用户来限制访问,这将在下面的回答中讨论。
match /mycol/{document=**} {
  allow read: if request.auth.uid != null; allow write: if request.auth.token.admin;
}
await admin.auth().setCustomUserClaims("user_user_id", { admin: true });