带有签名网址的Google存储空间

时间:2016-08-03 19:42:09

标签: cors google-cloud-storage pre-signed-url

如何上传内容类型mutlipart/formdata ---boundaryString的文件 使用谷歌存储的signed url

我面临的问题是,当我们使用浏览器上传文件时,浏览器会将内容类型mutlipart/formdata ---boundaryString放在其中boundaryString是内容类型标头值的动态部分。

现在,由于Google签名方法要求内容类型成为签名的一部分。生成签名的网址变得不可能。

1 个答案:

答案 0 :(得分:2)

要使用网络上的表单进行上传,GCS提供了一种名为“政策文件”的常规签名网址的替代方案。策略文档是一个已签名的上载策略,其中包含对上载类型和不合适的描述,并且作为表单帖子的参数之一包含在内。

有关详细信息,请参阅https://cloud.google.com/storage/docs/xml-api/post-object#policydocument

因此,例如,允许上传的HTML表单如下所示:

<form action="http://travel-maps.storage.googleapis.com"
 method="post"
enctype="multipart/form-data">
  <input type="text" name="key" value="">
  <input type="hidden" name="bucket" value="travel-maps">
  <input type="hidden" name="Content-Type" value="image/jpeg">
  <input type="hidden" name="GoogleAccessId" value="1234567890123@developer.gserviceaccount.com">
  <input type="hidden" name="acl" value="bucket-owner-read">
  <input type="hidden" name="success_action_redirect" value="http://www.example.com/success_notification.html">
  <input type="hidden" name="policy" value="eyJleHBpcmF0aW9uIjogIjIwMTAtMDYtMTZUMTE6MTE6MTFaIiwNCiAiY29uZGl0aW9ucyI6IFsNCiAgWyJzdGFydHMtd2l0aCIsICJrZXkiLCAiIiBdLA0KICB7ImFjbCI6ICJidWNrZXQtb3duZXItcmVhZCIgfSwNCiAgeyJidWNrZXQiOiAidHJhdmVsLW1hcHMifSwNCiAgeyJzdWNjZXNzX2FjdGlvbl9yZWRpcmVjdCI6ICJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3N1Y2Nlc3Nfbm90aWZpY2F0aW9uLmh0bWwiIH0sDQogIFsiZXEiLCAiQ29udGVudC1UeXBlIiwgImltYWdlL2pwZWciIF0sDQogIFsiY29udGVudC1sZW5ndGgtcmFuZ2UiLCAwLCAxMDAwMDAwXQ0KICBdDQp9">
  <input type="hidden" name="signature" value="BSAMPLEaASAMPLE6SAMPLE+SAMPPLEqSAMPLEPSAMPLE+SAMPLEgSAMPLEzCPlgWREeF7oPGowkeKk7J4WApzkzxERdOQmAdrvshKSzUHg8Jqp1lw9tbiJfE2ExdOOIoJVmGLoDeAGnfzCd4fTsWcLbal9sFpqXsQI8IQi1493mw=">
  <input name="file" type="file">
  <input type="submit" value="Upload">
</form>

“policy”字段包含用户可以上传内容的说明。这是一个基于64位编码的JSON文档。未编码,它看起来像这样:

{"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]
  ]
}

“签名”字段的工作方式与已签名的网址相同,但您要签署的是政策,而不是请求。它是策略文档的rsa / sha-256的base64编码。