从 Web 应用程序访问 Google 云存储,总是 403

Access Google Cloud Storage from web application, always 403

我正在开发 Web 应用程序作为与 Google 云存储 (GCS) 的接口。

我正在使用后端服务来检索我存储在 GCS 上的文件列表及其 URL 以及 JSON API 和 return 到我的网站应用。但是,我并不能真正通过那些 URL 加载文件,它们总是返回 403 forbidden。

我不确定 GCS 身份验证在幕后如何工作以及是否可以直接授予对 Web 应用程序的访问权限。我不确定如何通过 http 请求附加应用程序身份验证信息。我所知道的是我可以通过后端服务来做到这一点,但为了简单起见,我想知道是否有可能解决这个问题。我尝试过的一件事是将 Web 应用程序域(将通过 http 请求中的引荐来源网址发送)添加到该存储桶的 ACL 中,这根本不起作用。

感谢@Brandon 在下面指出的内容。我可以授予任何有权访问该应用程序的人查看 GCS 内容的权限,因为它是一个内部应用程序,并且我在首次提供 Web 应用程序时已经检查了他们的身份验证。

====

解决方案

我最终使用了 5 分钟后过期的 signedUrl,我强烈建议使用 gcloud 与 gcs 交互(他们的 python document 非常好)。再次感谢您的详尽回答!

您有一个用户在网络浏览器上想要下载一个只有您的应用程序的服务帐户具有读取权限的对象。您有几个选择:

  1. 扩大访问权限:使这些对象公开可读。如果此信息敏感,则可能不是最佳选择,但如果不敏感,这就是最简单的解决方案。
  2. 将您应用的凭据提供给用户,以便他们可以作为您的应用进行身份验证。这是一个非常糟糕的主意,我什至不应该在这里列出它。
  3. 当用户想要下载文件时,让他们向您的应用索要该文件,然后让您的应用获取文件并将其内容流式传输给用户。这是客户端代码最简单的解决方案,但它让您的应用程序负责流式传输文件内容,这并不是很好。
  4. 当用户想要下载文件时,让他们向您的应用请求许可,然后用某种令牌回复他们,他们可以使用这些令牌直接从 GCS 获取数据。

#4就是你想要的。您的用户会要求您的应用程序提供一个文件,您的应用程序将决定是否允许他们通过您正在做的任何事情(密码?IP 检查?Cookies?随便什么)访问该文件。然后,您的应用程序将以 URL 用户可以使用直接从 GCS 获取文件。

此 URL 称为 "signed URL." 您的应用程序使用自己的私钥向 URL 添加签名,指示承载者可以长期下载哪个对象URL 有效。可以生成它们的procedure for signing URLs is somewhat tricky, but fortunately the gcloud storage libraries have helper functions