要通过REST API访问Google云端存储到其他用户帐户,在使用OAuth 2.0进行身份验证后,将回复HTTP 403

时间:2014-01-30 08:11:19

标签: google-oauth google-cloud-storage

下面显示了我使用单个Google帐户成功开发应用程序后到目前为止所做的工作。

我创建了另一个启用了Google云端存储的Google帐户,以测试我是否可以使用一个帐户注册API项目,然后使用此客户端ID(和客户端密码)列出/创建存储桶或对象到另一个帐户。即通过步骤:

  1. “电子邮件帐户1”拥有“API项目1”,并将存储桶/对象Google Cloud Service帐户创建为“电子邮件帐户1”

  2. “电子邮件帐户1”拥有“API项目1”,并将存储桶/对象Google Cloud Service帐户创建为“电子邮件帐户2”

  3. “电子邮件帐户2”拥有“API项目2”,并将Google云端服务帐户创建存储桶/对象“电子邮件帐户1”

  4. “电子邮件帐户2”拥有“API项目2”,并将存储桶/对象Google Cloud Service帐户创建为“电子邮件帐户2”

  5. 很明显,第一种情况一切正常,因为所有的事情都属于同一帐户 在那之后,我被困在案例2中,HTTP响应代码403.(禁止,访问被拒绝)一旦我将其解释为项目只能在自己的帐户中写入数据。但是,我不相信它是合理的,然后,我尝试了步骤(3),即注册API项目2,然后使用OAuth2.0身份验证与“电子邮件帐户1”,它最终工作。

    然后,我尝试了案例(4),它仍然失败了HTTP 403!即项目所有者无法访问自己的Google云端存储服务!

    但是,使用Google OAuth2.0 Playground,我可以使用有问题的帐户(“电子邮件帐户2”)创建一个存储桶。

    任何人都可以给我一些提示,我的第二个帐户有什么问题?为什么API应用程序无法访问自己的Google Cloud Service,即使OAuth2.0已完成?

2 个答案:

答案 0 :(得分:1)

首先澄清命名法。电子邮件帐户不拥有存储桶:项目可以。您以用户身份登录,该用户可能有权为项目创建存储桶,但它是拥有该存储桶的项目。对象是不同的。对象归帐户所有。

原因是计费是按项目完成的。将对象存储在存储桶中时,该帐单将发送到拥有该对象所在存储桶的项目。

用户可以是多个项目的成员,因此当您尝试创建存储桶时,必须指定要创建存储桶的项目。项目只有在启用结算后才能创建存储桶。

所以你可能遇到过这样的事情:

  1. “电子邮件帐户1”拥有“API项目1”,该帐户已启用计费,可以创建属于项目1的存储桶,并可以在该存储桶中创建属于电子邮件帐户的对象。

    < / LI>
  2. “电子邮件帐户1”无法创建“API项目2”拥有的存储桶。

  3. 电子邮件帐户1可能有权创建属于项目1的存储桶,但它可能没有权限创建项目2拥有的存储桶。这可能有几个原因。也许电子邮件帐户1根本不是项目2的所有者或编辑者。或者,项目2可能没有创建存储桶的权限,因为项目2没有启用计费。

    然后我们进入案例4:“电子邮件帐户2”拥有“项目2”并且无法为“项目2”创建存储桶。

    由于电子邮件帐户2肯定拥有项目2,因此项目2的答案似乎很可能没有启用。

答案 1 :(得分:0)

通常,您可能会发现Google API返回403错误的原因有几个。以下是您应该检查的内容(所有Google API都通用):

对于与发出请求的客户关联的项目(对于服务帐户,这意味着服务帐户所属的项目):

  1. 正在访问的API已启用。
  2. 启用了结算(如果适用,则为API)
  3. 未超过配额:
    1. 每个项目(礼貌限制)
    2. 每位用户(可在Google Developer Console中配置)。
  4. 对于包含访问属于项目资源的API(例如大多数Cloud Platform API),上述内容也针对拥有该资源的项目(如果不同)进行验证。

    因此,对于您的问题 - 应允许属于项目A的服务帐户操作项目B中的资源(例如云存储桶/对象),前提是已将服务帐户添加到项目B的项目团队中,或者明确添加到Google云端存储分区/对象ACL条目。

    在任何情况下 - 项目A都需要启用Google云端存储服务(可能需要启用结算) - 但是,使用该服务帐户来操纵项目B拥有的资源将向项目B付费。

    有关此内容的更多背景,请参阅以下演示文稿: https://developers.google.com/events/io/sessions/333234305