下面显示了我使用单个Google帐户成功开发应用程序后到目前为止所做的工作。
我创建了另一个启用了Google云端存储的Google帐户,以测试我是否可以使用一个帐户注册API项目,然后使用此客户端ID(和客户端密码)列出/创建存储桶或对象到另一个帐户。即通过步骤:
“电子邮件帐户1”拥有“API项目1”,并将存储桶/对象Google Cloud Service帐户创建为“电子邮件帐户1”
“电子邮件帐户1”拥有“API项目1”,并将存储桶/对象Google Cloud Service帐户创建为“电子邮件帐户2”
“电子邮件帐户2”拥有“API项目2”,并将Google云端服务帐户创建存储桶/对象“电子邮件帐户1”
“电子邮件帐户2”拥有“API项目2”,并将存储桶/对象Google Cloud Service帐户创建为“电子邮件帐户2”
很明显,第一种情况一切正常,因为所有的事情都属于同一帐户 在那之后,我被困在案例2中,HTTP响应代码403.(禁止,访问被拒绝)一旦我将其解释为项目只能在自己的帐户中写入数据。但是,我不相信它是合理的,然后,我尝试了步骤(3),即注册API项目2,然后使用OAuth2.0身份验证与“电子邮件帐户1”,它最终工作。
然后,我尝试了案例(4),它仍然失败了HTTP 403!即项目所有者无法访问自己的Google云端存储服务!
但是,使用Google OAuth2.0 Playground,我可以使用有问题的帐户(“电子邮件帐户2”)创建一个存储桶。
任何人都可以给我一些提示,我的第二个帐户有什么问题?为什么API应用程序无法访问自己的Google Cloud Service,即使OAuth2.0已完成?
答案 0 :(得分:1)
首先澄清命名法。电子邮件帐户不拥有存储桶:项目可以。您以用户身份登录,该用户可能有权为项目创建存储桶,但它是拥有该存储桶的项目。对象是不同的。对象归帐户所有。
原因是计费是按项目完成的。将对象存储在存储桶中时,该帐单将发送到拥有该对象所在存储桶的项目。
用户可以是多个项目的成员,因此当您尝试创建存储桶时,必须指定要创建存储桶的项目。项目只有在启用结算后才能创建存储桶。
所以你可能遇到过这样的事情:
“电子邮件帐户1”拥有“API项目1”,该帐户已启用计费,可以创建属于项目1的存储桶,并可以在该存储桶中创建属于电子邮件帐户的对象。
< / LI>“电子邮件帐户1”无法创建“API项目2”拥有的存储桶。
电子邮件帐户1可能有权创建属于项目1的存储桶,但它可能没有权限创建项目2拥有的存储桶。这可能有几个原因。也许电子邮件帐户1根本不是项目2的所有者或编辑者。或者,项目2可能没有创建存储桶的权限,因为项目2没有启用计费。
然后我们进入案例4:“电子邮件帐户2”拥有“项目2”并且无法为“项目2”创建存储桶。
由于电子邮件帐户2肯定拥有项目2,因此项目2的答案似乎很可能没有启用。
答案 1 :(得分:0)
通常,您可能会发现Google API返回403错误的原因有几个。以下是您应该检查的内容(所有Google API都通用):
对于与发出请求的客户关联的项目(对于服务帐户,这意味着服务帐户所属的项目):
对于包含访问属于项目资源的API(例如大多数Cloud Platform API),上述内容也针对拥有该资源的项目(如果不同)进行验证。
因此,对于您的问题 - 应允许属于项目A的服务帐户操作项目B中的资源(例如云存储桶/对象),前提是已将服务帐户添加到项目B的项目团队中,或者明确添加到Google云端存储分区/对象ACL条目。
在任何情况下 - 项目A都需要启用Google云端存储服务(可能需要启用结算) - 但是,使用该服务帐户来操纵项目B拥有的资源将向项目B付费。
有关此内容的更多背景,请参阅以下演示文稿: https://developers.google.com/events/io/sessions/333234305