使用通用签名网址和卷曲

时间:2015-05-06 02:15:51

标签: google-app-engine curl

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

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

gsutil signurl -p notasecret -m PUT -d 1d myserviceaccount.p12 gs://mybucket/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

下一步(在用户端)将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'

我可以使用它来处理存储桶中的现有文件和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>

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

不知何故,我受到了这种印象(例如,基于gsutil signurl documentation和帖子How to allow anonymous uploads to cloud storage中描述的最后一个用例),应该可以为上传目的生成通用签名网址然后再使用它。我只是弄错了这一点,还是有办法解决curl请求?

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

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

curl -X PUT -T - [request-url] < testfile

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

gsutil signurl -p notasecret -m PUT -d 1d myserviceaccount.p12 gs://mybucket/

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

3 个答案:

答案 0 :(得分:1)

如果资源未指定单个对象,则可以通过向请求添加URL参数以及对象的名称来单独执行此操作。例如:

storage/v1

这肯定适用于alter session set nls_sort=binary; select regexp_instr ('123abc','[A-Z]') from dual; REGEXP_INSTR('123ABC','[A-Z]') ------------------------------ 0 alter session set nls_sort=binary_ci; select regexp_instr ('123abc','[A-Z]') from dual; REGEXP_INSTR('123ABC','[A-Z]') ------------------------------ 4 ,虽然我还没有尝试使用已签名的网址。

答案 1 :(得分:1)

这是我逼疯了。原来是binary-file部分curl命令。试试:

curl -X PUT --upload-file me.jpeg $SIGNED_URL

答案 2 :(得分:0)

我遇到了类似的问题(403禁止) 事实证明,出于安全考虑,我使用它来编组每个响应的json库会将&替换为\u0026。因此,该程序中的URL可能是正确的,但在客户端侧无效 所以我猜你的网址的Signature查询字符串中可能会有一些字符串编码错误,因为与我的\u0026相比,签名字符串更难以检测错误。