当前位置: 首页 > 知识库问答 >
问题:

要通过REST API访问Google云存储到另一个用户帐户,在使用OAuth2.0验证后,HTTP 403将被回复

叶鸿
2023-03-14

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

我已经创建了另一个启用Google云存储的Google帐户,以测试我是否可以使用一个帐户注册API项目,然后使用此客户端ID(

>

  • 电子邮件帐户1拥有API项目1,并创建桶/对象谷歌云服务帐户到电子邮件帐户1

    "电子邮件帐户1"拥有"API项目1",并创建桶/对象谷歌云服务帐户到"电子邮件帐户2"

    “电子邮件帐户2”拥有“API项目2”,并将bucket/objects创建为“电子邮件帐户1”的谷歌云服务帐户

    “电子邮件帐户2”拥有“API项目2”,并将bucket/objects创建为“电子邮件帐户2”的谷歌云服务帐户

    很明显,案例一是可以的,因为所有的事情都在同一个账户下
    之后,我一直被困在案例2中,HTTP响应代码为403。(禁止,拒绝访问)有一次,我将其解释为项目只能在其自己的帐户中写入数据。然而,我不认为这是合理的,然后,我尝试了步骤(3),即注册API项目2,然后使用OAuth2。使用“电子邮件帐户1”进行0身份验证,最终有效。

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

    然而,使用GoogleOAuth2。0,我可以使用有问题的帐户(“电子邮件帐户2”)创建一个存储桶。

    谁能给我一些提示,我的第二个帐户有什么问题?为什么API应用程序不能访问自己的Google云服务,即使OAuth2。0完成了吗?

  • 共有2个答案

    江瀚昂
    2023-03-14

    一般来说,您可能会看到GoogleAPI返回403错误的原因有很多。以下是您应该检查的内容(所有Google API都有):

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

    1. 正在访问的API已启用

    对于包括访问属于项目的资源(例如大多数云平台API)的API,还将针对拥有该资源的项目(如果不同)验证上述内容。

    因此,对于您的问题-应该允许属于项目a的服务帐户操作项目B中的资源(如云存储桶/对象),前提是服务帐户已添加到项目B的项目团队中,或已显式添加到Google云存储桶/对象ACL条目中。

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

    有关这方面的更多背景信息,请参见以下演示:https://developers.google.com/events/io/sessions/333234305

    计弘
    2023-03-14

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

    这是因为账单是按每个项目进行的。将对象存储在bucket中时,账单将发送到拥有该对象所在bucket的项目。

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

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

    >

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

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

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

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

    由于电子邮件帐户2肯定拥有项目2,因此答案很可能是项目2未启用计费。

  •  类似资料:
    • 我正试图从Python脚本中获得一个服务帐户来在Google Cloud Storage中创建Blob,但我遇到了凭据问题。 如果我将环境变量设置为 然后重新运行脚本。但是,我希望它在创建帐户的脚本的一个实例中运行,并继续在桶中创建必要的文件。如果我知道我的json凭据文件在哪里,我如何访问my_bucket。

    • 我已经创建了一个Google云平台服务帐户,,具有存储管理员()角色。 现在,我希望限制此帐户,使其只能访问特定的谷歌云存储(GCS)存储桶()。 现在的问题是,可以访问所有GCS存储桶。我无法从其他GCS存储桶中删除,因为被继承。 那我该怎么办?

    • 我正在尝试使用django-storages为带有服务帐户json文件的google云存储桶授予权限。但是,只有当我向所有具有对象视图权限的用户授予访问权限时,才能访问桶中的项目。我如何限制桶的公共访问。

    • 我有两个帐户和两个线程。1个线程将钱从1个帐户转到2个帐户,2个线程将钱从2个帐户转到1个帐户,当然前提是有足够的钱。我需要了解死锁情况,并解决死锁情况以确认安全转移。以下是我目前的想法: 账户.java 主类 传输线程.java 为了安全转移,我决定将存款和取款两种方法同步。但怀疑用方法运行实现。我有正确的实现吗?如果不是,解释和纠正将不胜感激。

    • 我有2个AWS帐户。我试图复制文件从帐户1到帐户2在桶2在美国西部2地区。我有所有必要的IAM政策,相同的凭据适用于两个帐户。我使用python boto3库。 如图所示,复制函数在指向目标帐户2/us-west-2的客户端对象上执行。它是如何获取帐户1/us-east1中的源文件的?我应该提供作为复制函数的输入吗?

    • 我打算将包含所有文件和目录的整个目录从一个谷歌云存储桶递归复制到另一个谷歌云存储桶。 从本地到Google云存储桶,以下代码运行良好: 如何在同一个项目中将目录从一个bucket递归复制到另一个bucket?