在Firebase存储上使用SSL的自定义域名

fkaflof6  于 2023-01-27  发布在  其他
关注(0)|答案(7)|浏览(189)

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

to94eoyn

to94eoyn1#

我来的有点晚了,这个问题可能已经在其他地方得到了答案。然而,由于这是我在谷歌上搜索这个功能时找到的第一个结果,这里什么也没有:
首先,假设您有一个CNAME(如assets.somedomain.com)指向c.storage.googleapis.com,并创建了一个名为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>

这意味着即使查询字符串中包含了令牌,被代理的请求也没有权限,下一步就是让bucket在Google Cloud Console -> Storage中公开可读。

(This可以使用gcloud cli完成,但我发现这种方法更容易解释)
注意使用遗留对象读取器权限,它阻止访问者实际列出存储桶内容。
之后,您应该能够使用以下命令访问映像:

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

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

watbbzwu

watbbzwu2#

目前,我们不支持Cloud Storage for Firebase中的自定义域。
您有两种选择:
1.使用Firebase Hosting(开发人员生成的内容)
1.通过GCS静态托管(docs)进行设置
无论哪种情况,您都将无法使用Firebase SDK for Cloud Storage,以及它的身份验证和授权功能。
很高兴了解更多关于用例的信息,看看我们将来是否应该支持它。

yyhrrdl8

yyhrrdl83#

2021年4月更新

Firebase 8.4.0引入了storage().useEmulator(host, port)
您仍然需要一个反向代理,您可以使用Google Cloud Load Balancer或其他工具。

pb3skfrl

pb3skfrl4#

实际上,实现你的需求是非常简单的--也就是说,在你的自定义域下提供你的存储内容,并提供SSL支持。
这里的关键是,正如我曾经被firebase支持所提示的那样,storage api是为开发者内部使用的,包括指向文件的url,它们并不打算暴露给最终用户,这一点一开始听起来有点奇怪,但在我给它一点提示之后,它开始变得有意义了。
这是我如何用更新后的视角来解决这个问题。
1.您可以创建一个专用的端点来重定向到云函数。
1.该端点将接受存储url作为参数。
1.然后,云计算函数会读取url并将其内容流回。
就是这样。
不需要复杂的代理设置等,您的所有内容现在将在您的自定义域下提供服务。
下面是这样一个函数的核心逻辑的简单示例:

(req, res, next) => {
    let link = req.query.url
    const https = require('https');
    //request the content of the link
    https.get(link, response => {
        if (response.statusCode < 200 || response.statusCode > 299) {
            //handle error
        } else {
            //stream the content back to client
            response.pipe(res)
            res.on("close", () => response.destroy())
        }
    });
}

现在您可以执行类似以下操作(假设您的函数托管在'storage/content'下):

https://my-custon-domain.com/storage/content?url={{put your storage url that refers to a file}}

在浏览器中打开这样的链接将显示您的文件内容(或根据浏览器的设置下载)
如果这个答案得到更多的关注,我会发布一个更详细的解释和例子。

vbkedwbf

vbkedwbf5#

我完全同意前面的回答,非常感谢。但是我正在以更好的方式写说明
1.创建一个桶与您自定义的域名在谷歌云平台-〉存储.
1.创建旧版对象查看器权限并将其添加到所有用户。注意:您必须从筛选器文本中搜索旧版对象查看器
1.在您的域服务提供商帐户中添加一条DNS记录,该记录将指向c.storage.googleapis.com。
1.如果您没有,请创建一个cloudflare帐户
1.在cloudflre中添加网站,您需要把您的域名而不是子域复制名称服务器详细信息从cloudflare到您的DNS服务提供商名称服务器详细信息
1.移动cloudflare中的所有dns记录需要一些时间。
1.转到cloudflare中的页面规则,添加www.example.com并打开始终使用https assets.yourdomain.com and turn on always use https
你完了

czfnxgou

czfnxgou6#

对于GCloud用户来说,
1.去控制台,
1.开放式负载平衡
1.提供别名并处理assets.yourdomain.com指向 */images/的Map
它将创建一个新的平衡器与ip地址,它是多地区别担心。
1.打开云CDN,给予别名并选择您创建的平衡器。
选择您的存储桶名称,即您的firebase存储的存储桶名称。
1.去你的域名提供商,如GoDaddy,并把这个ip地址指向assets.yourdomain.com平衡器的ip。
总而言之;
谷歌正在处理认证过程,它给你一个IP,你添加一个指向给定IP的记录。
当你访问www.example.com时assets.yourdomain.com,它会转到谷歌,谷歌会指向你的水桶。
完成需要5分钟,但我已经花了1周的时间来了解它是如何工作的:)

3htmauhk

3htmauhk7#

使用Firebase存储意味着您正在使用GCP云存储Bucket
使用GCP负载平衡功能,您基本上可以将GCP存储存储桶暴露给公共IPv4。并管理SSL证书。
然后,转到域提供商控制台,将“A记录”添加到您的BucketIP。
这是一个伟大的职位:https://deliciousbrains.com/wp-offload-media/doc/how-to-set-up-a-custom-domain-cdn-for-google-cloud-storage/
GCP = Google CLoud Platform
请注意,GCP负载平衡不是免费的。

相关问题