我想直接从python客户端上传/下载文件到Amazon S3,在一些用户机器上运行。我有一个服务器,它托管访问ID和密钥,因为它们不能在用户端,可用于生成预先签名的URL,并且客户端可以通过API连接以请求这些预先签名的URL
我找到了很多JS的例子,但是在客户端也没有一个python的例子(不是基于web的)。我曾尝试在客户端使用boto,但似乎没有简单的方法可以利用boto API,但使用远程签名对请求进行签名。
有没有办法可以使用boto来处理来自客户端的转移?到目前为止,似乎最好的方法是使用python请求构建我自己的客户端,但我认为重新发明轮子几乎听起来。
到目前为止,我已经能够修补HmacKeys(来自boto.auth,在boto2中),因此不再需要provider.secret_key(并且不会引发NotReadyToAuthenticate())并且我可以覆盖签名,注入API调用以进行远程签名。但这似乎非常棘手,脆弱且难以维护。有没有其他方法与boto实现这一目标?
答案 0 :(得分:4)
您应该通过AWS Security Token Service (STS)生成临时凭据,而不是签署网址(通常在通过网络浏览器进行调用时使用)。
从您的服务器发出GetFederationToken
API call以生成临时凭证:
您的Python应用程序将在调用boto
时使用这些凭据。只允许用户在指定的时间范围内制作您在策略中允许的API。
答案 1 :(得分:2)
我最近发布了requests-aws-sign,它为Python请求库提供了AWS V4请求签名。
请参阅https://github.com/jmenga/requests-aws-sign
如果查看https://github.com/jmenga/requests-aws-sign/blob/master/requests_aws_sign/requests_aws_sign.py - 您将看到如何使用Botocore生成V4请求签名。
答案 2 :(得分:0)
Boto3可以为任何方法调用创建预先签名的URL:
generate_presigned_url(ClientMethod, Params=None, ExpiresIn=3600, HttpMethod=None)
根据客户端,方法和参数
生成预签名URL<强>参数:强>
- ClientMethod(string) - 为
指定的客户端方法- Params(dict) - 通常传递给ClientMethod的参数。
- ExpiresIn(int) - 预签名URL有效的秒数。默认情况下,它会在一小时后到期(3600秒) HttpMethod(string) - 在生成的url上使用的http方法。默认情况下,http方法是方法模型中使用的任何方法。
<强>返回:强> 预先签署的网址
我刚刚使用它来签署list_buckets()
来电并返回了一个大网址,例如:
https://s3-ap-southeast-2.amazonaws.com/?AWSAccessKeyId=ASIAIIIYTGIS5XQCSI6Q&Expires=1441192915&x-amz-security-token=AQoDYXdzENP%2F...37w%3D
将其粘贴到浏览器中以XML格式返回存储桶列表。