【问题标题】:Generating download URLs for storage生成用于存储的下载 URL
【发布时间】:2020-09-11 05:05:19
【问题描述】:

我有几个关于 Firebase 存储的问题?

我正在使用管理员帐户(具有自定义声明)为 Firebase 存储对象生成下载 URL,并将 URL 存储在 Firestore 上。

用户可以阅读 Firestore 文档来获取 URL,而不必在客户端代码上调用 getDownloadUrl。

Q1) 我注意到存储 URL 的末尾有一个令牌。这是否特定于我的管理员帐户,现在没有管理员用户可以读取此令牌是否安全?

Q2) 此外,如果在同一存储路径上调用 getDownloadUrl 的非管理员用户,他们会收到与管理员帐户相同的 URL 还是不同的 URL?

Q3) 如果我改用在客户端使用 getDownloadUrl,这会增加我在使用 Firebase 存储时的成本吗?

Q4) 如果我通过 URL 缓存内容并且 URL 发生更改,它将重新下载而不使用缓存。这些下载链接是唯一的,还是 getDownloadURL 可以在后续调用中返回不同的 URL?

非常感谢

编辑---

抱歉,我还有一个问题

Q5)要在 firebase 存储上移动文件,我目前将它们下载到本地电脑并重新上传到另一个位置 - 似乎效率很低。

我似乎有人在使用 file.move()(可以看到here。)

这是否可以调用 firebase 函数(因为他们说存储规则是 cmets 中的一个问题,尽管它是从 2016 年开始的),如果是这样,这会比我的手动下载和上传便宜吗?

很抱歉有很多问题:)

【问题讨论】:

    标签: node.js firebase google-cloud-functions firebase-storage


    【解决方案1】:

    Q1) 我注意到存储 URL 的末尾有一个标记。这是否特定于我的管理员帐户,现在没有管理员用户可以读取此令牌是否安全?

    此令牌是为此特定文件生成的随机 ID。它不会更改,除非您有意更改它(您可以从 Firebase 控制台“撤销”令牌,它将用新令牌替换它)。拥有该 URL 的每个人都可以查看该文件,无论他们是否经过身份验证。但是,该 URL “难以猜测”,因此除非您与任何人分享,否则它实际上是保密的。

    Q2) 此外,如果在同一存储路径上调用 getDownloadUrl 的非管理员用户,他们会收到与管理员帐户相同的 URL 还是不同的 URL?

    返回的 URL 将始终相同,除非您在 Firebase 控制台中使其无效。如果您不希望客户端对文件调用 getDownloadURL,请添加拒绝读取的存储安全规则:

    match /path/to/{file} {
      allow read: if false;
    
      // Or, if only authed users should be able to call getDownloadURL:
      allow read: if request.auth != null;
    }
    

    Q3)如果我改用在客户端使用 getDownloadUrl,这会增加我在使用 Firebase 存储时的成本吗?

    对 getDownloadUrl() 的调用确实使用了一些您需要付费的 Google Cloud 资源,无论您是在服务器端还是在客户端进行调用。这是一个“B 类”操作(查看 Google Cloud 定价)和一些数据传输。

    Q4)如果我通过 URL 缓存内容并且 URL 发生更改,它将重新下载而不使用缓存。这些下载链接是唯一的还是 getDownloadURL 可以在后续调用中返回不同的 URL? p>

    每次都返回相同的 URL,除非您手动使令牌无效。 (顺便说一句,设置Cache-Control 标头的缓存策略在您上传时作为元数据设置在对象上。)

    Q5) 为了在 firebase 存储上移动文件,我目前将它们下载到本地电脑并重新上传到另一个位置 - 似乎效率很低。 [..]这可以调用firebase函数吗

    是的,您可以在 Firebase 云函数中移动文件。 Firebase Admin SDK 绕过安全规则。

    【讨论】:

    • 这很有帮助。谢谢您的回答...我不知道 gcp 定价页面,并且只使用了 firebase 定价页面..您是否碰巧知道是否创建了对 firestore 的文档引用...例如db.collection('users').doc(context.auth.uid);花钱吗?还是只是。当您调用 get/update/delete 时,是否有与使用 Firestore 事务相关的任何费用......例如db.runTransaction(async function(transaction) { 我无法在 gcp 定价网站上找到有关它们枯萎的详细信息。
    • 不,创建引用不会产生任何网络请求(这就是为什么无论数据是否实际存在都可以创建引用)。没有与交易相关的额外费用,您只需为实际的读取/写入付费(来源:此 Google Developer Expert for Firebase:stackoverflow.com/a/58660916/4667355
    • 太棒了 :) 再次感谢@nicoqh
    【解决方案2】:

    1) 我注意到存储 URL 的末尾有一个令牌。这是否特定于我的管理员帐户,现在没有管理员用户可以读取此令牌是否安全?

    取决于您目前所拥有的,因为您可以将自定义身份验证与 Firebase 集成,这将允许您创建自定义令牌,这些令牌可用于在客户端应用程序上登录 Firebase 身份验证服务并采用令牌描述的身份宣称。这可以在访问其他 Firebase 服务时使用,例如 Cloud Storage 等。 一般来说,您的服务器应该创建一个具有唯一标识符的自定义令牌。

    2) 此外,如果在同一存储路径上调用 getDownloadUrl 的非管理员用户,他们会收到与管理员帐户相同的 URL 还是不同的 URL?

    取决于您如何设置 getDownloadUrl 的权限。如果你有一个自定义的,他们可以收到一个不同的,但通常它会返回一个指向当前引用的新实例。

    3) 如果我切换到在客户端使用 getDownloadUrl,这会增加我在使用 Firebase 存储时的成本吗?

    对此我不确定,我已经检查了文档,没有任何内容表明此特定方法的配额或定价,所以我会继续假设它不会这样做,但我可能错了一个。

    4) 如果我通过 URL 缓存内容并且 URL 发生更改,它将重新下载而不使用缓存。这些下载链接是唯一的还是 getDownloadURL 可以在后续调用中返回不同的 URL?

    如前所述,它返回一个指向当前引用的新实例,因此这些下载链接是唯一的。

    5) 为了在 firebase 存储上移动文件,我目前将它们下载到本地电脑并重新上传到另一个位置 - 似乎效率很低。

    对于这个问题和您最初帖子的最后一部分,我建议您创建一个支持票证并向 Firebase 支持团队询问更多详细信息,您可以获得有关此的更多信息,因为它比 StackOverflow 更适合他们. (https://firebase.google.com/support)

    【讨论】:

      猜你喜欢
      • 2018-08-09
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 2016-11-24
      • 1970-01-01
      • 2021-10-23
      • 2017-06-07
      相关资源
      最近更新 更多