Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 获取403“;匿名调用方没有storage.objects.get访问权限;尝试使用已签名的URL上载到GCS时_Google App Engine_Google Cloud Platform_Google Cloud Storage_Google Cloud Iam - Fatal编程技术网

Google app engine 获取403“;匿名调用方没有storage.objects.get访问权限;尝试使用已签名的URL上载到GCS时

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>

我正在尝试使用将文件直接从浏览器上载到GCS。我正在从一个appengine标准PHP应用程序生成一个
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
但我就是搞不清楚他们需要加入哪个角色

在这一点上,我认为有两种可能性之一:

  • 签名的URL实际上不起作用,因为它应该作为服务帐户进行身份验证,而不是匿名的。在这种情况下,是什么导致了这种情况
  • 签名URL作为某种类型的匿名角色进行身份验证,但该角色没有权限。在这种情况下,如何添加该角色的权限(
    alluser
    显然是错误的)

  • 已解决:

    我的实现有很多问题:

  • 正如Brandon&Charles在下文中所建议的那样,
    signedUploadUrl
    不适用于直接
    PUT
    。为了解决这个问题,我需要使用
    beginSignedUploadSession
  • 正如下面John所建议的,我需要在服务帐户用户上添加
    Storage Object Creator
    。但是,这已经添加到GAE默认服务帐户中,因为它是
    Project Editor
  • 服务帐户令牌创建者
    需要显式添加到服务帐户,因为
    项目编辑器
    似乎没有涵盖它
  • 我将URL嵌入到Javascript中,并使用Twig uses
    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
    请求,并且它给出了相同的错误。