2017-02-09 132 views
0

我试图上传.jpeg文件到谷歌云存储,但我的请求失败,出现以下401错误。获取401错误,原因:匿名用户没有storage.objects.create访问存储桶

{ 
"error": { 
    "errors": [ 
    { 
    "domain": "global", 
    "reason": "required", 
    "message": "Anonymous users does not have storage.objects.create access to bucket XXXtest.", 
    "locationType": "header", 
    "location": "Authorization" 
    } 
    ], 
    "code": 401, 
    "message": "Anonymous users does not have storage.objects.create access to bucket XXXtest." 
} 
} 

我的POST请求看起来像这样。

<form id="upload_image_form" class="" action="https://www.googleapis.com/upload/storage/v1/b/XXXtest/o?uploadType=media&name=myObject" method="post" enctype="multipart/form-data"> 
    <input id="image" name="image" type="file" accept="image/x-png, image/jpeg, image/png" onchange=""> 

    <input type="hidden" name="Content-Type" value="image/jpeg"> 
    <input type="hidden" name="name" value="my_name"> 
    <input type="hidden" name="Accept" value="application/json, text/json, text/x-json, text/javascript"> 
    <input type="hidden" name="host" value="www.googleapis.com"> 
    <input type="hidden" name="Transfer-Encoding" value="chunked"> 
    <input type="hidden" name="Authorization" value="<?php echo 'Bearer'.' '.$_SESSION['access_token']['access_token']; ?>"> 
    <input type="hidden" name="Expect" value="100-continue"> 
    <input type="hidden" name="Accept-Encoding" value="gzip, deflate"> 
    <input type="hidden" name="Connection" value="Keep-Alive"> 
    <input type="hidden" name="acl" value="bucket-owner-writer"> 
    <input id="upload" name="upload" value="Upload" type="submit" style="position: absolute;"> 

</form> 

你能告诉我根据这documentation丢失了什么?

+1

你检查/设置ACL? https://cloud.google.com/storage/docs/access-control/create-manage-lists –

+3

哇,你真的不想这样做!您正在向表单中的最终用户传递访问令牌。这不仅不会起作用,还会使所有查看该页面的用户都可以使用该用户的凭据执行任何他们想要的操作。这就像在HTML评论中包含密码一样。 –

+0

嗨@DanCornilescu是的我设置了价值“桶拥有者作家”,但它仍然无法正常工作。 – MKB

回答

1

要允许用户通过表单POST将对象上传到GCS,您需要创建一个描述用户可以上传的对象类型的“策略文档”,然后对其进行签名,然后将该签名的文档作为表单中的参数。您可以详细了解如何通过一个帖子在这里上传到GCS:https://cloud.google.com/storage/docs/xml-api/post-object

,并注意尤其是部分签署政策文件位置:https://cloud.google.com/storage/docs/xml-api/post-object#policydocument

下面是一个例子政策文件:

{"expiration": "2010-06-16T11:11:11Z", 
"conditions": [ 
    ["starts-with", "$key", "" ], 
    {"acl": "bucket-owner-read" }, 
    {"bucket": "travel-maps"}, 
    {"success_action_redirect": "http://www.example.com/success_notification.html" }, 
    ["eq", "$Content-Type", "image/jpeg" ], 
    ["content-length-range", 0, 1000000] 
    ] 
} 

你然后base64那个文件,用你希望用户作为上传目的的服务帐户的私钥签名结果,然后在隐藏字段中提供它们,如下所示:

<input type="hidden" name="policy" value="eyJleHBpcmF0aW9uIjogIjIwMTAtMDYtMTZUMTE6MTE6MTFaIiwNCiAiY29uZGl0aW9ucyI6IFsNCiAgWyJzdGFydHMtd2l0aCIsICJrZXkiLCAiIiBdLA0KICB7ImFjbCI6ICJidWNrZXQtb3duZXItcmVhZCIgfSwNCiAgeyJidWNrZXQiOiAidHJhdmVsLW1hcHMifSwNCiAgeyJzdWNjZXNzX2FjdGlvbl9yZWRpcmVjdCI6ICJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3N1Y2Nlc3Nfbm90aWZpY2F0aW9uLmh0bWwiIH0sDQogIFsiZXEiLCAiQ29udGVudC1UeXBlIiwgImltYWdlL2pwZWciIF0sDQogIFsiY29udGVudC1sZW5ndGgtcmFuZ2UiLCAwLCAxMDAwMDAwXQ0KICBdDQp9"> 
<input type="hidden" name="signature" value="BSAMPLEaASAMPLE6SAMPLE+SAMPPLEqSAMPLEPSAMPLE+SAMPLEgSAMPLEzCPlgWREeF7oPGowkeKk7J4WApzkzxERdOQmAdrvshKSzUHg8Jqp1lw9tbiJfE2ExdOOIoJVmGLoDeAGnfzCd4fTsWcLbal9sFpqXsQI8IQi1493mw="> 
+0

嗨布兰登。感谢这个有用的信息。我是谷歌云新手。我不知道如何创建这个文档(可能是一个愚蠢的问题)。我可否知道我们是否必须创建一个具有上述配置的文件,并包含编码文件路径或在代码中执行其他操作? – MKB

+1

策略文档是使用base64编码的JSON字符串,并作为POST请求的一部分作为隐藏输入传递给GCS。你可以在你的代码中声明它是一个常量,或者你可以在运行中使用JSON和base64库生成一个。 –

相关问题