远程签署python客户端

时间:2015-09-01 23:43:10

标签: python amazon-s3 boto boto3

我想直接从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实现这一目标?

3 个答案:

答案 0 :(得分:4)

您应该通过AWS Security Token Service (STS)生成临时凭据,而不是签署网址(通常在通过网络浏览器进行调用时使用)。

从您的服务器发出GetFederationToken API call以生成临时凭证:

  • 凭据有时间限制(最多36小时)
  • 可以指定策略,用于定义授予的权限集
  • 然后将这些凭据传递给您的客户端Python应用

您的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:

来自the Boto3 documentation

  

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格式返回存储桶列表。