我可以将一个自定义域名Map到我的Firebase存储桶,只需将存储桶命名为与我的域名相同的名称,然后将CNAME记录指向c.storage.googleapis.com。但是,https不起作用,因为证书上的通用名称不同。我是否可以上传证书,或者更好地让GCP或Firebase管理证书?
to94eoyn1#
我来的有点晚了,这个问题可能已经在其他地方得到了答案。然而,由于这是我在谷歌上搜索这个功能时找到的第一个结果,这里什么也没有:首先,假设您有一个CNAME(如assets.somedomain.com)指向c.storage.googleapis.com,并创建了一个名为assets.somedomain.com的存储桶。
assets.somedomain.com
c.storage.googleapis.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来绕过这个问题,它就像一个代理,不问任何问题。
/o/
*.storage.googleapis.com
您再次尝试,但是在中间的某个地方请求变成匿名的,并且您得到一个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中公开可读。
Google Cloud Console -> Storage
(This可以使用gcloud cli完成,但我发现这种方法更容易解释)注意使用遗留对象读取器权限,它阻止访问者实际列出存储桶内容。之后,您应该能够使用以下命令访问映像:
https://assets.somedomain.com/arduino.png
请注意,您甚至不需要包含"alt = media",因为cloudflare将提供文件而不是元数据。
watbbzwu2#
目前,我们不支持Cloud Storage for Firebase中的自定义域。您有两种选择:1.使用Firebase Hosting(开发人员生成的内容)1.通过GCS静态托管(docs)进行设置无论哪种情况,您都将无法使用Firebase SDK for Cloud Storage,以及它的身份验证和授权功能。很高兴了解更多关于用例的信息,看看我们将来是否应该支持它。
yyhrrdl83#
Firebase 8.4.0引入了storage().useEmulator(host, port)。您仍然需要一个反向代理,您可以使用Google Cloud Load Balancer或其他工具。
storage().useEmulator(host, port)
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'下):
storage/content
https://my-custon-domain.com/storage/content?url={{put your storage url that refers to a file}}
在浏览器中打开这样的链接将显示您的文件内容(或根据浏览器的设置下载)如果这个答案得到更多的关注,我会发布一个更详细的解释和例子。
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你完了
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周的时间来了解它是如何工作的:)
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负载平衡不是免费的。
7条答案
按热度按时间to94eoyn1#
我来的有点晚了,这个问题可能已经在其他地方得到了答案。然而,由于这是我在谷歌上搜索这个功能时找到的第一个结果,这里什么也没有:
首先,假设您有一个CNAME(如
assets.somedomain.com
)指向c.storage.googleapis.com
,并创建了一个名为assets.somedomain.com
的存储桶。然后上传一个文件,其公共url如下所示:
其可被视为:
您 * 应该 * 能够使用以下命令查看所述文件:
那就是
(基本上就是去掉原始的基本URL和
/o/
前缀)但是,您当然会得到一个巨大的警告,告诉您证书无效,因为它是针对
*.storage.googleapis.com
的。在我的例子中,我能够使用cloudflare的通用SSL来绕过这个问题,它就像一个代理,不问任何问题。
您再次尝试,但是在中间的某个地方请求变成匿名的,并且您得到一个XML,声明您缺少storage.objects.get权限。
这意味着即使查询字符串中包含了令牌,被代理的请求也没有权限,下一步就是让bucket在
Google Cloud Console -> Storage
中公开可读。(This可以使用gcloud cli完成,但我发现这种方法更容易解释)
注意使用遗留对象读取器权限,它阻止访问者实际列出存储桶内容。
之后,您应该能够使用以下命令访问映像:
请注意,您甚至不需要包含"alt = media",因为cloudflare将提供文件而不是元数据。
watbbzwu2#
目前,我们不支持Cloud Storage for Firebase中的自定义域。
您有两种选择:
1.使用Firebase Hosting(开发人员生成的内容)
1.通过GCS静态托管(docs)进行设置
无论哪种情况,您都将无法使用Firebase SDK for Cloud Storage,以及它的身份验证和授权功能。
很高兴了解更多关于用例的信息,看看我们将来是否应该支持它。
yyhrrdl83#
2021年4月更新
Firebase 8.4.0引入了
storage().useEmulator(host, port)
。您仍然需要一个反向代理,您可以使用Google Cloud Load Balancer或其他工具。
pb3skfrl4#
实际上,实现你的需求是非常简单的--也就是说,在你的自定义域下提供你的存储内容,并提供SSL支持。
这里的关键是,正如我曾经被firebase支持所提示的那样,storage api是为开发者内部使用的,包括指向文件的url,它们并不打算暴露给最终用户,这一点一开始听起来有点奇怪,但在我给它一点提示之后,它开始变得有意义了。
这是我如何用更新后的视角来解决这个问题。
1.您可以创建一个专用的端点来重定向到云函数。
1.该端点将接受存储url作为参数。
1.然后,云计算函数会读取url并将其内容流回。
就是这样。
不需要复杂的代理设置等,您的所有内容现在将在您的自定义域下提供服务。
下面是这样一个函数的核心逻辑的简单示例:
现在您可以执行类似以下操作(假设您的函数托管在'
storage/content
'下):在浏览器中打开这样的链接将显示您的文件内容(或根据浏览器的设置下载)
如果这个答案得到更多的关注,我会发布一个更详细的解释和例子。
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
你完了
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周的时间来了解它是如何工作的:)
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负载平衡不是免费的。