谷歌云存储使用通用签名网址和卷曲上传

bjo*_*eru 10 google-app-engine curl

我试图从命令行将文件放入Google云存储(GCS)存储桶.在稍后阶段,这将在用户端的部署脚本中使用,而不使用任何类型的用户可见身份验证.

到目前为止,我生成了一个这样的签名网址:

gsutil signurl -p notasecret -m PUT -d 1d myserviceaccount.p12 gs://mybucket/testfile
Run Code Online (Sandbox Code Playgroud)

这会产生类似的东西

https://storage.googleapis.com/mybucket/testfile?GoogleAccessId=myserviceaccount@developer.gserviceaccount.com&Expires=1430963040&Signature=gMf2h95bNmolizUGYrsQ%2F%2F%2FiHxW14I%2F0EOU3ZSFWtfCwNqSyok3iweQiuPxYXH4b26FeDSrmFOXB58%2B%2B%2BiAOJ%2B1gdLC9Y%2BkeUdbrjH0eGTW0NVsM1AWY2LsQ3dYf5Ho%2Bos1Fk26EsLJlD096Ku9aWqLW%2FpL% 2FBSsUIfHijrFJPdI%3D

下一步(在用户端)将curl使用PUT请求上载文件.像这样:

curl -X PUT --data-binary @testfile 'https://storage.googleapis.com/mybucket/testfile?GoogleAccessId=myserviceaccount@developer.gserviceaccount.com&Expires=1430963040&Signature=gMf2h95bNmolizUGYrsQ%2F%2F%2FiHxW14I%2F0EOU3ZSFWtfCwNqSyok3iweQiuPxYXH4b26FeDSrmFOXB58%2B%2B%2BiAOJ%2B1gdLC9Y%2BkeUdbrjH0eGTW0NVsM1AWY2LsQ3dYf5Ho%2Bos1Fk26EsLJlD096Ku9aWqLW%2FpL%2FBSsUIfHijrFJPdI%3D'
Run Code Online (Sandbox Code Playgroud)

我可以使用它来处理存储桶中的现有文件和GET请求(用于下载),但它似乎不适用于上载.curl用我这样的错误消息抛出服务器的响应:

<?xml version='1.0' encoding='UTF-8'?>
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided.
         Check your Google secret key and signing method.</Message>
<StringToSign>PUT

application/x-www-form-urlencoded
1430963040
/mybucket/testfile</StringToSign>
</Error>
Run Code Online (Sandbox Code Playgroud)

这对我来说很有意义,因为很明显,我不只是提出一个PUT请求,而是一个特定大小的特定文件,而'gsutil signurl'计算的签名在这个时候不会知道这些细节.计算.

不知何故,我的印象是(例如,基于gsutil signurl文档中描述的最后一个用例以及帖子如何允许匿名上传到云存储),应该可以生成用于上载目的的通用签名URL,然后使用它后来.我只是弄错了这一点,还是有办法解决这个问题curl

对此有任何想法表示赞赏.但是,我希望这可以使用"最小工具",即理想情况下只有shell和curl,但没有其他编程语言.

编辑: 通过制定确切的问题来组织一个人的想法是迈向解决方案的第一步.我现在意识到了

curl -X PUT -T - [request-url] < testfile
Run Code Online (Sandbox Code Playgroud)

确实解决了眼前的问题.但是,这意味着如果多个用户使用相同的签名URL,则会写入同一文件.文档建议您可以在创建签名URL时省略对象名称,即使用

gsutil signurl -p notasecret -m PUT -d 1d myserviceaccount.p12 gs://mybucket/
Run Code Online (Sandbox Code Playgroud)

据推测,这将允许任何拥有最终签名网址的人将任何类型的任何对象放入我的桶中.只有我没有得到这个工作,因为我没有看到你怎么能告诉GCS你实际写的是哪个对象.

Oli*_*haw 5

这也让我抓狂。原来这是binary-filecurl命令的一部分。试试这个:

curl -X PUT --upload-file me.jpeg $SIGNED_URL
Run Code Online (Sandbox Code Playgroud)


Jos*_*gia 1

如果资源未指定单个对象,您可以通过将 URL 参数添加到带有对象名称的请求来单独指定。例如:

curl -X PUT -T - [request-url]?name=[object-name] < testfile

storage/v1尽管我还没有尝试过使用签名 URL,但这确实适用于。