我正在为一个服务编写一个客户端,该服务为上传提供一个签名的url。对于较小的上传来说,这样做很好,但是对于较大的上传则失败,因为使用多部分上传会有好处。在
授权文档建议我可以在URL中或通过授权头使用提供的签名和访问密钥id。我尝试过使用头方法来启动多部分上传,但是访问被拒绝。当我使用查询字符串方法时,我得到了一个不允许的方法(在本例中是POST)。在
我使用boto来生成URL。例如:
import boto
c = boto.connect_s3()
bucket = c.get_bucket('my-bucket')
key = boto.s3.key.Key(bucket, 'my-big-file.gz')
signed_url = key.generate_url(60 * 60, 'POST') # expires in an hour
然后,当尝试使用签名的URL启动多部分上载时,我将执行以下操作:
^{pr2}$这将返回一个不允许的方法。在
这个策略可行吗?有没有更好的方法可以向特定资源提供有限的凭据,以便允许进行大规模的多部分上载?在
更新
我设法找到了一个稍微更具体的错误,使我认为这是不可能的。不幸的是,我收到了403,说签名与请求不匹配。在
<?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 key and signing method.</Message>
<StringToSignBytes>.../StringToSignBytes>
<RequestId>...</RequestId>
<HostId>...</HostId>
<SignatureProvided>...</SignatureProvided>
<StringToSign>POST
1402941975
/my-sandbox/test-mp-upload.txt?uploads</StringToSign>
<AWSAccessKeyId>...</AWSAccessKeyId>
</Error>
这使我认为我不能使用签名的URL,因为签名不匹配。在
更新
我认为使用签名的URL进行多部分上传是不合理的。虽然我怀疑这在技术上是可能的,但并不实用。原因是签名的URL需要URL、头和请求方法完全匹配,才能按预期工作。由于多部分上载需要初始化上载、上载每个部分并完成(或取消)上载,因此为每个步骤生成URL会有些痛苦。在
在bucket中找到一个联合令牌来提供读/写访问。这最终变得更加实际和简单,因为我可以立即使用boto,就像我有证书一样。在
为了回答我自己的问题,最好的选择是使用安全令牌服务来生成一组临时凭据。可以提供策略描述来将凭据限制为特定的bucket和key。在
下面是一些代码,可以为下一个想这样做的人节省时间:
相关问题 更多 >
编程相关推荐