flutter - 没有用户身份验证的 Firestore 安全规则
问题描述
我有一个简单的加密货币应用程序,它使用 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';
}
}
解决方案
为了获得最佳安全性,请将您的安全规则视为应用程序逻辑的一部分,与应用程序代码处于同一级别。这意味着您的规则应该只允许您的应用程序代码需要的确切用法。
由于您没有分享相关代码,我将在下面做出一些假设和一般性建议。
如果您的代码确实get()
调用了Data
集合中的所有文档,那么您当前的规则就是一个很好的代理。但是,例如,如果您的代码仅访问该集合中的单个文档,则这将是更接近的等价物:
allow get: if true;
这意味着代码可以获取单个文档,但无法获取集合中的所有文档。
如果您的代码仅访问特定文档,您可以进一步收紧规则,只允许它们读取该文档,并进一步生成您现在可能在Data
集合中拥有的其他文档 - 或将来添加。
推荐阅读
- amazon-web-services - Cloudwatch 日志代理无法识别日志日期
- sql - 使用 IN 对长文本字段匹配 2 个表之间的值
- google-cloud-platform - 从桌面客户端使用私有 IP 连接到 CloudSQL
- docker - docker-compose.yml 中的整数变量表达式
- ionic-framework - 在组件颜色属性中使用颜色变化不起作用
- ms-access - Access 报告文本框仅显示 255 个字符的较长查询结果
- c# - 如何制作响应 ubuntu 14.04 和 16.04 上的 syslog 事件的 ac# 程序?
- javascript - cropper.js 在左键单击位置周围创建裁剪区域?
- python - 基于字符串方法的python集合的子集
- html - 如何从 CSS 样式中排除具有填充属性的 SVG