【发布时间】:2021-08-12 07:55:13
【问题描述】:
我有这些要求:
- 我想将文件上传到 Firebase 存储。
- 我想存储这些文件的 URL 列表(在 firebase firestore 数据库中)。
- 我想使用存储规则限制查看这些文件。
将文件上传到 Firebase 存储非常简单。
var uploadTask = await firebase_storage.FirebaseStorage.instance
.ref(ref)
.putFile(
file,
firebase_storage.SettableMetadata(
customMetadata: _customMetaData(ownerId, readAccess)));
var url = await _getUrl(uploadTask);
之后检索 url 以访问文件也很简单。
var url = await uploadTask.ref.getDownloadURL();
但是,这个 url 包含一个安全令牌,它基本上绕过了我设置的安全规则。任何拥有包含令牌的 url 的人都可以访问该文件。所以......我没有像这样检索网址,而是实现了这个:
var url = await _getUrl(uploadTask);
在哪里...
/*
* When we retrieve the download url using getDownloadURL then this include security token
* This makes the URL accessible for everybody, bypassing any security rule.
* I'm assuming that by removing the token this url becomes a URL only accessible for
* those who have access rights through the storage rules.
*/
static Future<String> _getUrl(firebase_storage.TaskSnapshot uploadTask) async {
var url = await uploadTask.ref.getDownloadURL();
var uri = Uri.parse(url);
var newMap = Map<String, dynamic>.from(uri.queryParameters)..removeWhere((k, v) => k == 'token');
var newUri = uri.replace(queryParameters: newMap);
var newUrl = newUri.toString();
return newUrl;
}
问题是:这是正确的方法吗?我很困惑为什么没有标准方法可以在没有令牌的情况下检索 url。我也很困惑为什么没有人问这个问题。那么:我错过了什么?
【问题讨论】:
标签: firebase flutter firebase-storage