我正在尝试从命令行将文件放入Google云端存储(GCS)存储桶。在稍后阶段,这将在用户端的部署脚本中使用,而不需要任何类型的用户可见身份验证。
到目前为止,我生成了一个这样的签名网址:
gsutil signurl -p notasecret -m PUT -d 1d myserviceaccount.p12 gs://mybucket/testfile
将产生类似
的内容下一步(在用户端)将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你实际写的是哪个对象。
答案 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
相比,签名字符串更难以检测错误。