当前位置: 首页 > 知识库问答 >
问题:

FiRecovery从Android应用程序只读并使用API KEY写入的规则是什么?

杜志
2023-03-14

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

我的场景是这样的:一个Android应用程序,用户只会读取数据。他们不会保存,他们不会修改任何东西。他们不会注册。这只是数据读取。

就我而言,我需要写在那个集合中。我计划使用 API 密钥通过 cURL 来执行此操作。

我使用的规则如下:

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

我想阻止访问我的收藏,例如通过来自任何地方的 URL:

< code > https://firestore . Google APIs . com/v1/projects/my project/databases/(default)/documents/mydoc/mycol/

例如,避免机器人发起不分青红皂白的请求,这些请求会夸大我的账单......

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

共有2个答案

呼延俊风
2023-03-14

由于您正在尝试使用此规则只读和仅写入特定于某些conditions.Try。在条件中指定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与您的数据库规则中的应用程序令牌进行比较

常睿范
2023-03-14

你并没有真的关闭你的收藏,相反,你允许任何人在里面写东西。

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

Admin SDK 具有安全性,因此您可以删除写入部分,它只适用于您。

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

然后,您可以像这样(从 Node)为用户设置声明:

await admin.auth().setCustomUserClaims("user_user_id", { admin: true });

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

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

 类似资料:
  • 问题内容: 我正在尝试在基于AndEngine的游戏中集成一些Android语音API。 我将代码放在BaseGame活动中-但是此错误在运行时出现: 05-06 23:51:28.955:错误/ AndroidRuntime(553):java.lang.RuntimeException:SpeechRecognizer仅应从应用程序的主线程使用 如何访问应用程序主线程?以及如何确保我的语音代码

  • 我有一个应用程序,它试图将字符串序列化为资产目录下的文本文件。写入操作不会引发任何异常,尽管写入操作后文件为空(这意味着写入操作没有成功)。 我的问题是为什么不能写入文件。

  • 我对Kafka和Kafka流很陌生,所以请容忍我。我想知道我是否在正确的轨道上。 我正在给一个Kafka主题写信,试图通过rest服务访问数据。在访问原始数据之前,需要对其进行转换。 到目前为止,我拥有的是一个将原始数据写入主题的制作人。 1)现在我想要streams应用程序(应该是一个在容器中运行的jar),它可以将数据转换为我想要的形状。遵循这里的物化视图范式。 1的过度简化版本。) 2)和另

  • 下面是jboss guvnor 5.5构建和部署包的屏幕。 在guvnor 6.0 cr3中创建部署快照的等效过程是什么? 换句话说,我正在考虑部署使用guvnor 6.0编写的规则,并从java应用程序执行它。 其中changeset.xml保存了包的快照url。 我了解guvnor 6.0或drools工作台中的顶级架构更改。 但我找不到从java应用程序部署规则和执行的方法。

  • 我一直在尝试开发一个android应用程序,可以从CIFS/SMB协议中提取信息。我尝试过JCIFS,但由于我的eclipse应用程序无法读取包(即使在我使用Javadoc读取包之后)而不断出现错误,我最后的办法就是寻求帮助。因此,有人能提供如何做到这一点的煽动/信息吗? 我试过这个:复制所有文件从服务器到Android设备 我试过这个:http://jcifs.samba.org/ 我试过这个:

  • 问题内容: 我正在为Java编程竞赛编写一些代码。程序的输入是使用stdin给出的,输出是在stdout上给出的。你们如何测试可在stdin / stdout上运行的程序?这就是我的想法: 由于System.in的类型为InputStream,而System.out的类型为PrintStream,因此我使用以下原型在函数中编写了代码: 现在,我想使用junit对此进行测试。我想使用字符串伪造Sys