【问题标题】:Custom domain name with SSL on Firebase Storage在 Firebase 存储上使用 SSL 的自定义域名
【发布时间】:2018-04-04 18:27:19
【问题描述】:

只需将存储桶命名为与我的域名相同的名称,然后将 CNAME 记录指向 c.storage.googleapis.com,我就能够将自定义域名映射到我的 Firebase Storage 存储桶。但是,https 不起作用,因为证书上的通用名称不同。我是否可以上传证书,或者更好的是让 GCP 或 Firebase 管理证书?

【问题讨论】:

    标签: firebase firebase-storage


    【解决方案1】:

    我来晚了一点,这个问题可能已经在其他地方得到了回答。但是,由于这是我在谷歌上搜索此功能时发现的第一个结果,所以这里什么都没有:

    首先,假设您有一个像 assets.somedomain.com 这样指向 c.storage.googleapis.com 的 CNAME,然后您创建了一个名为 assets.somedomain.com 的存储桶。

    然后你上传一个文件,它的公共 url 看起来像:

    https://firebasestorage.googleapis.com/v0/b/assets.somedomain.com/o/arduino.png?alt=media&token=asdf
    

    可以看作:

    firebasestorage.googleapis.com/v0/b/  
    +
    assets.somedomain.com
    +
    /o/
    +
    arduino.png?alt=media&token=asdf
    

    应该可以使用以下方式查看所述文件:

    https://assets.somedomain.com/arduino.png?alt=media&token=asdf
    

    这是

    assets.somedomain.com/
    +
    arduino.png?alt=media&token=asdf
    

    (基本上,你去掉了原始的基本 URL 和 /o/ 前缀)

    但是你当然会收到一个很大的警告,告诉你证书无效,因为它是为*.storage.googleapis.com 准备的。

    在我的例子中,我能够使用 cloudflare 的通用 SSL 来规避这个问题,它就像一个不问任何问题的代理。

    您再试一次,但在中间的某个地方,请求变得匿名,并且您收到一个 XML 说明您缺少 storage.objects.get 权限。

    <Error>
        <Code>AccessDenied</Code>
        <Message>Access denied.</Message>
        <Details>
            Anonymous users does not have storage.objects.get access to object.
        </Details>
    </Error>
    

    这意味着即使查询字符串中包含令牌,代理请求也没有权限。然后,下一步是使存储桶在Google Cloud Console -&gt; Storage 中公开可读。

    (这可以使用 gcloud cli 完成,但我发现这种方法更容易解释)

    注意使用遗留对象读取权限,这会阻止访问者实际列出存储桶内容。

    之后,您应该可以使用以下方式访问图像:

    https://assets.somedomain.com/arduino.png
    

    请注意,您甚至不需要包含“alt=media”,因为 cloudflare 将提供文件而不是其元数据。

    【讨论】:

    • 很好的答案,这适用于 http,但是,我的域以 .app 结尾,需要 ssl 证书。有解决办法吗?
    • Cloudflare 通用 ssl。我使用了与您相同的顶级域名
    • PD:我觉得您已经在使用 Cloudflare 并且将其 SSL 设置设置为任何其他粉丝“完整”,通过创建页面规则确保对您的资产子域的请求使用“完整”。
    • 我在“下一步,就是让存储桶公开可读...”时失去了你,你能提供更多细节吗?我找到了Google Cloud Console -&gt; Storage 页面。我应该采取哪些步骤来公开存储桶?我不能通过 Firebase 规则进行设置吗?
    • 我设法做到了。 Add members -> New members = allUsers, Role = Storage Legacy -&gt; Storage Legacy Object Reader.
    【解决方案2】:

    目前我们不支持 Cloud Storage for Firebase 中的自定义域。

    你有两个选择:

    1. 使用 Firebase 托管(开发者生成的内容)
    2. 通过 GCS 静态托管 (docs) 进行设置

    但是,无论哪种情况,您都将无法使用 Firebase SDKs for Cloud Storage,以及它的身份验证和授权功能。

    很高兴了解有关用例的更多信息,看看我们将来是否应该支持它。

    【讨论】:

    • 用例,我认为这很常见,我们需要从各种应用程序中提供动态内容。我们的应用程序之一是基于 Web 的代码编辑器。所以我们将用户的静态网络文件存储在 Firebase 存储中。然后我们想从 Firebase 存储中为它们提供服务。我们现在可以这样做,效果很好。但是没有带有自定义域的 https/SSL。我们可以在 Firebase Storage 中使用自定义域,只需在域名之后命名存储桶并将域名的 CNAME 指向 c.storage.googleapis.com
    • Google's Images Best Practices 说“为您的图片创建良好的 URL 结构:Google 使用 URL 路径和文件名来帮助它理解您的图片。考虑组织您的图片内容,以便按照逻辑构建 URL 。”因此,拥有传统的“驱动”结构对网站管理员来说很重要。
    • 这还是不行吗?目前,我正在为我的图像存储一个完整的 URL,例如:https://firebasestorage.googleapis.com/v0/b/_PROJECTNAME_.appspot.com/o/_FOLDERNAME_%2F_FILENAME_.jpg?alt=media。理想情况下,我想连接/重写从我的自定义域(如/asset)到存储桶的路径。
    【解决方案3】:

    2021 年 4 月更新

    Firebase 8.4.0 introduces storage().useEmulator(host, port)

    您仍然需要一个反向代理,您可以使用 Google Cloud Load Balancer 或其他代理。

    【讨论】:

      【解决方案4】:

      我完全同意之前的回答,非常感谢。但我正在以更好的方式编写指令

      1. 在谷歌云平台中用你的自定义域名创建一个bucket->存储。

      2. 创建遗留对象查看器的权限并将其添加到所有用户。注意:您必须从过滤文本中搜索遗留对象查看器

      3. 在您的域服务提供商帐户中添加一条 DNS 记录,其中包含指向 c.storage.googleapis.com 的 CNAME 资产。

      4. 如果没有,请创建 cloudflare 帐户

      5. 在 cloudflre 中添加网站,您需要在其中放置域名而不是子域 将名称服务器详细信息从 cloudflare 复制到您的 DNS 服务提供商名称服务器详细信息

      6. 移动 cloudflare 中的所有 dns 记录需要一些时间。

      7. 转到 cloudflare 中的页面规则并添加 assets.yourdomain.com 并打开始终使用 https

      你已经完成了

      【讨论】:

      • 如果您有完整的存储桶 URL,您仍然可以超越 Cloudfare 安全性,对吗?
      猜你喜欢
      • 2017-07-02
      • 1970-01-01
      • 2017-01-08
      • 2012-12-26
      • 2019-05-31
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 2015-11-07
      相关资源
      最近更新 更多