从 Web 应用程序访问 Google Cloud Storage,始终为 403

yee*_*lan 1 google-app-engine web-applications google-cloud-storage

我正在开发一个 Web 应用程序,作为与 Google Cloud Storage (GCS) 的接口。

我正在使用后端服务通过 JSON API 检索我存储在 GCS 上的文件列表及其 URL,并将其返回到我的 Web 应用程序。但是,我真的无法通过这些 URL 加载文件,这些 URL 总是以 403 forbidden 返回。

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

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

====

解决方案

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

Bra*_*ugh 5

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

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

#4 是你想要的。您的用户会向您的应用索要文件,您的应用将决定是否允许他们通过您正在执行的任何操作(密码?IP 检查?Cookie?等等)访问该文件。然后,您的应用将使用用户的 URL 进行响应可用于直接从 GCS 获取文件。

此 URL 称为“签名 URL”。您的应用程序使用其自己的私钥向 URL 添加一个签名,该签名指示承载者可以下载哪个对象,并且该 URL 是有效的。签署 URL过程有些棘手,但幸运的是 gcloud 存储库具有可以生成它们的辅助函数