Google Cloud Storage:如何才能将已安装的应用程序授予对一个存储桶的访问权限?

Google Cloud Storage: How can I grant an installed application access to only one bucket?

我正在开发一个应用程序来处理 Google 云存储中的数据 用户拥有的桶。我想设置它以便用户可以安排 为了 如果应用程序以某种方式 运行 失控(或者它是 被坏演员冒充或其他什么)。

但我对有关 GCS 授权的文档有点困惑。 OAuth 2.0 authentication 上的文档显示只有三个 范围的选择:read-onlyread-writefull-control。做这个 意味着我想要的是不可能的,如果我授予访问 read/write 一个 我要授予对 read/write 我所有存储桶的访问权限吗?

让我更加困惑的是我不明白这一切是如何发挥作用的 与 GCS 的项目概念。好像我必须创建一个项目才能获得 我的应用程序的客户端 ID,N 个用户还必须为创建 N 个项目 他们的水桶。但这似乎并不重要——来自项目的客户 ID A 可以访问项目 B 的存储桶。项目 ID 的实际用途是什么?

所以我的问题总结如下:

  1. 我可以让我安装的应用程序请求一个仅适用于 单桶?

  2. 如果没有,开发者and/or细心的用户有没有其他方法 通常限制访问?

  3. 如果我做不到,这意味着访问令牌具有严重的安全性 影响。但我不想让用户去生成一个新的 每次他们 运行 应用程序。缓存令牌的典型故事是什么?

  4. 项目 ID 到底有什么用?它们与授权相关吗? 方式?

很抱歉这个问题很草率;它反映了看起来是什么 给我的是散乱的文档。 (或者至少不是文档 面向已安装的应用程序用例。)

我遇到了和你一样的问题

转到:https://console.developers.google.com

  • 转到凭据并创建新的客户端 ID
  • 您必须删除项目 "permissions" 中的电子邮件*。
  • 并在您的存储桶的 ACL 中手动添加它。

*= 服务帐户的电子邮件。 xxxxxxxxxxxx-xxxxxxxxx@developer.gserviceaccount.com

如果您正在构建应用程序。它是服务器到服务器 OAuth。 https://developers.google.com/accounts/docs/OAuth2ServiceAccount

"Can you be clearer about which project I create the client ID on (the developer's project that owns the installed application, or the user's project that own's the bucket)?"

the user's project that own's the bucket It's the user taht own the bucket who grant access.

事实证明,如果我想这样做,我使用了错误的 OAuth 流程。感谢 Euca 寻找解决这个问题的灵感。

我问这个问题的时候,我假设有多个项目 参与 Google 开发者控制台:

  1. 作为开发人员,我的一个项目包含为 一个 "installed application",其中包含客户端 ID 和(假设的)秘密 我的源代码。

  2. 我的每个用户一个项目,拥有一个存储桶并为其付费 他们正在使用该应用程序访问。

我没有使用 "installed application" 凭据,而是切换到 "service account" 凭据,由拥有的项目中的用户生成 他们的水桶。这允许他们创建和下载一个 JSON 密钥文件,他们 可以提供给我的应用程序,然后使用 OAuth 的 JSON Web 令牌流 2.0(又名"two-legged OAuth")获得授权。这样做的好处是:

  • 我不再需要有自己的项目了,这很奇怪 过程中的疣。

  • 默认情况下,服务帐户凭据允许我的应用程序访问 只有为其生成的项目所拥有的存储桶。如果 用户有其他项目和其他存储桶,应用程序无法访问它们。

  • 但是,服务帐户有一个 "email address" 就像任何其他用户一样,并且 可以添加到任何存储桶的 ACL,无论项目如何,授予 访问该存储桶。

关于你的回答。

很高兴您解决了问题。

您还可以减少对项目的一个存储桶的访问。例如,如果您有多个存储桶并且应用程序不需要访问所有存储桶。 默认情况下,服务帐户对所有存储桶具有读取、写入和 ACL 的完全访问权限。我通常只限于需要的桶。