没有用户身份验证的 Firestore 安全规则

时间:2021-04-09 17:15:40

标签: flutter google-cloud-firestore firebase-security

我有一个简单的加密货币应用程序,它使用 API 来获取价格。我正在使用 Firestore 存储我的 API 密钥,我的应用在启动时从 Firestore 检索我的 API 密钥。我的 API 密钥是我在 Firestore 中拥有的唯一数据。由于我的应用程序不允许用户创建配置文件/帐户,因此我的规则中没有包含用户身份验证。我的 Firestore 安全规则是:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /Data/{Data} {
      allow read: if true;
    }
  }
}

是否有更好的安全规则来提高安全性,或者这些规则是否足够好?

编辑

下面的文件“url-builder.dart”是我从 Firestore 检索 API 密钥的方式。然后,我将 API 密钥插入到 URL 末尾。

import 'package:cloud_firestore/cloud_firestore.dart';

class URLBuilder {
  URLBuilder(this.cryptoCurrency, this.currency, this.periodValue);

  String cryptoCurrency;
  String currency;
  String periodValue;

  String _pricesAndTimesURL;
  String get pricesAndTimesURL => _pricesAndTimesURL;

  Future<String> getApiKey() async {
    return FirebaseFirestore.instance
        .collection("Data")
        .doc("APIKeyDocument")
        .get()
        .then((value) {
      return value.data()["Key"];
    });
  }

  Future<void> buildURL() async {
    String apiKey = await getApiKey();
    _pricesAndTimesURL =
        'https:$urlStart/markets/kraken/$cryptoCurrency$currency/ohlc?periods=$periodValue&apikey=$apiKey';
  }
}

1 个答案:

答案 0 :(得分:3)

为了获得最佳安全性,请将您的安全规则视为应用程序逻辑的一部分,与应用程序代码处于同一级别。这意味着您的规则应该只允许您的应用程序代码需要的确切用法。

由于您没有分享相关代码,我将在下面做出一些假设和一般性建议。

如果您的代码对 get() 集合中的所有文档进行了 Data 调用,那么您当前的规则就是一个很好的代理。但是,例如,如果您的代码仅访问该集合中的单个文档,则这将是更接近的等价物:

allow get: if true;

这意味着代码可以获取单个文档,但无法获取集合中的所有文档。

如果您的代码仅访问特定文档,您可以进一步收紧规则,只允许他们阅读文档,并进一步生成您在 Data 中可能拥有的其他文档现在收藏 - 或将来添加。