【问题标题】:Access Google Cloud Storage from web application, always 403从 Web 应用程序访问 Google Cloud Storage,始终为 403
【发布时间】:2016-12-12 23:50:42
【问题描述】:

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

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

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

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

====

解决方案

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

【问题讨论】:

  • 您想使用谁的权限?您的应用程序自己的权限,还是您应用程序的各个用户(拥有自己的 Google 帐户)的权限?
  • 感谢@Brandon。为简单起见,我想使用应用程序权限,因为它是一个内部应用程序。另外,我知道我有可能有一个后端服务(如果它们也托管在 GAE 上)请求使用 appid 进行访问。但我真的很想简单地依赖前端。

标签: google-app-engine web-applications google-cloud-storage


【解决方案1】:

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

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

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

此 URL 称为“签名 URL”。您的应用程序使用自己的私钥向 URL 添加签名,指示承载者可以下载哪个对象,并且该 URL 长期有效。 procedure for signing URLs 有点棘手,但幸运的是 gcloud 存储库 have helper functions 可以生成它们。

【讨论】:

  • 感谢 Brandon 对解决方案进行了全面的比较。我记得我们的另一个应用程序中的一个恰好使用了解决方案 #4,但当时 API 并不那么友好。但是,希望迁移到 gcloud as 可以让事情变得更简单。
  • 签名网址的缺点是其有效期仅为 7 天。如果 7 天后需要再次访问同一个文件,则需要重新生成 URL。
猜你喜欢
  • 2017-12-24
  • 1970-01-01
  • 2012-08-21
  • 2021-01-05
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多