Google app engine 获取403“;匿名调用方没有storage.objects.get访问权限;尝试使用已签名的URL上载到GCS时
我正在尝试使用将文件直接从浏览器上载到GCS。我正在从一个appengine标准PHP应用程序生成一个Google app engine 获取403“;匿名调用方没有storage.objects.get访问权限;尝试使用已签名的URL上载到GCS时,google-app-engine,google-cloud-platform,google-cloud-storage,google-cloud-iam,Google App Engine,Google Cloud Platform,Google Cloud Storage,Google Cloud Iam,我正在尝试使用将文件直接从浏览器上载到GCS。我正在从一个appengine标准PHP应用程序生成一个v4签名的URL,它似乎工作正常。问题是,当我尝试将放入该URL时,我会得到一个403,其XML响应如下: <?xml version='1.0' encoding='UTF-8'?> <Error> <Code>AccessDenied</Code> <Message>Access denied.</Message>
v4
签名的URL,它似乎工作正常。问题是,当我尝试将
放入该URL时,我会得到一个403
,其XML响应如下:
<?xml version='1.0' encoding='UTF-8'?>
<Error>
<Code>AccessDenied</Code>
<Message>Access denied.</Message>
<Details>Anonymous caller does not have storage.objects.create access to <bucket-name>/some-object.txt.</Details>
</Error>
我的应用程序引擎服务帐户具有服务帐户令牌创建者
,这使URL得以创建
我已启用桶上的CORS接受PUT
到*
,这允许我到达现在的位置
我已经从v2
URL切换到v4
,因为Go SDK认为这是一个问题
我使用PHP谷歌云库生成签名URL,如下所示:
$storage=new StorageClient();
$bucket=$storage->bucket(“”);
$object=$bucket->object('some-object.txt');
$url=$object->signedupladurl(new\DateTime('moother'),['version'=>'v4']);
我尝试将服务帐户添加到bucket的权限中,并添加存储对象管理员
,存储对象创建者
,等等。但似乎没有什么能让我通过这一403
(除了向诱惑者
)之外)
文章中是这样说的
此外,在云存储中,您需要授予以下权限以生成已签名的URL
storage.bucket.get
storage.objects.create
storage.objects.delete
alluser
显然是错误的)已解决: 我的实现有很多问题:
signedUploadUrl
不适用于直接PUT
。为了解决这个问题,我需要使用beginSignedUploadSession
Storage Object Creator
。但是,这已经添加到GAE默认服务帐户中,因为它是Project Editor
服务帐户令牌创建者
需要显式添加到服务帐户,因为项目编辑器
似乎没有涵盖它constURL={{upload_URL}}
,但是Twig会自动对变量进行HTML编码,这样会破坏URL,相反,我需要使用{{upload\u URL | raw}}
。这种不正确的格式是邮件包含匿名来电者的原因signedUploadUrl
为POST HTTP方法创建URL(请参阅位于的库源代码)。您正在将该签名URL用于PUT请求,因此不允许该请求。错误消息没有显示这是问题所在,但我认为这才是真正的问题所在
您可以研究如何通过POST上传文件,也可以为PUT创建签名URL。我已经用Python完成了后者,但是我看不到用这个库实现它的方法。我不是PHP程序员,所以我可能会错过它
或者,您可以创建自己的代码来创建PUT的签名URL,以库代码为例。签名的URL要想准确无误非常困难,创建自己的代码可能会令人沮丧。这是用Python编写的。一些问题/建议:生成的URL是什么样子的?您是使用POST来启动使用该URL的可恢复上载,还是尝试直接将数据上载到提供的URL?如果是后者,您可能希望改用
beginSignedUploadSession
。@BrandonYarbrough我正在做的PUT
直接放到URL,我已经尝试了signedUploadUrl
和beginSignedUploadSession
,在这两种情况下,错误都是相同的。@BrandonYarbrough该URL太长,无法在此处发布,因此我将其放在那里。错误意味着您用于创建签名URL的标识没有存储。对象。create
向用于创建签名URL的服务帐户添加云存储角色。@JohnHanley我已添加存储Object Creator
指向app engine服务帐户和服务帐户在bucket上的权限,遗憾的是,我仍然收到相同的错误。我现在转到beginSignedUploadSession()
,它应该允许直接PUT
请求,并且它给出了相同的错误。