1

我想直接从 python 客户端上传/下载文件到 Amazon S3,在一些用户机器上运行。我有一个服务器,托管访问 ID 和密钥,因为它们不能在用户端,可用于生成预签名的 url,并且客户端可以通过 API 连接以请求这些预签名的 url .

我发现了很多 JS 的例子,但在客户端(不是基于 Web)中也没有一个使用 python 的例子。我曾尝试在客户端使用 boto,但似乎没有简单的方法可以利用 boto API,而是使用远程签名对请求进行签名。

有没有办法可以使用 boto 来处理来自客户端的传输?到目前为止,似乎最好的方法是使用 python-requests 构建我自己的客户端,但我认为重新发明轮子听起来很像。

到目前为止,我已经能够对 HmacKeys 进行猴子补丁(来自 boto.auth,在 boto2 中),因此不再需要 provider.secret_key(并且不会引发 NotReadyToAuthenticate())并且我可以覆盖签名,注入 API要求远程签名。但这似乎非常棘手、脆弱且难以维护。boto 还有其他方法可以实现这一目标吗?

4

3 回答 3

4

您应该通过AWS 安全令牌服务 (STS)生成临时凭证,而不是签署 URL(通常在通过 Web 浏览器进行调用时使用) 。

从您的服务器发出GetFederationTokenAPI 调用以生成临时凭证:

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

然后,您的 Python 应用程序将在调用boto. 仅允许用户在指定的时间范围内制作您在策略中允许的 API。

于 2015-09-02T02:17:57.907 回答
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 请求签名。

于 2016-07-17T04:13:40.747 回答
0

Boto3 能够为任何方法调用创建预签名 URL:

Boto3 文档

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 方法是方法模型中使用的任何方法。

返回: 预签名的 url

我只是用它来签署一个list_buckets()电话,它返回一个大 URL,例如:

https://s3-ap-southeast-2.amazonaws.com/?AWSAccessKeyId=ASIAIIIYTGIS5XQCSI6Q&Expires=1441192915&x-amz-security-token=AQoDYXdzENP%2F...37w%3D

将其粘贴到浏览器中会返回 XML 格式的存储桶列表。

于 2015-09-02T10:26:43.413 回答