代码之家  ›  专栏  ›  技术社区  ›  A. Cedano

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

  •  0
  • A. Cedano  · 技术社区  · 7 年前

    我对消防商店的安全规则有疑问。

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

      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键通过cURL写入)?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Ricardo Smania    7 年前

    你并不是真的要关闭你的收藏,相反,你允许任何人向它写信。

    为了只允许您自己写入集合,有几个选项。你可以用 Admin SDK 然后写一个只在你的机器上运行的小程序。

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

    match /mycol/{document=**} {
      allow read: if request.auth.uid != null;
    }
    

    这可能是最简单的选择,而且它是安全的,只要您保证您的凭据安全,并且只在受信任的计算机/网络中这样做。

    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 });
    

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

        2
  •  2
  •   Mr. Patel    7 年前

    由于您正在尝试对某些条件执行只读和只写操作,请尝试使用此规则。在此条件内指定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);
    });
    

    运行此代码后,请转到日志,然后复制令牌,然后仅在条件中指定该令牌,然后尝试使用应用程序令牌创建一个身份验证id,然后将该身份验证id与数据库规则中的应用程序令牌进行比较