当我拥有硬编码的访问密钥和密钥时,我能够生成经过身份验证的 url,供用户查看 S3 上的私有文件。这是通过以下代码完成的:
import hmac
import sha
import urllib
import time
filename = "".join([s3_url_prefix, filename])
expiry = str(int(time.time()) + 3600)
h = hmac.new(
current_app.config.get("S3_SECRET_KEY", None),
"".join(["GET\n\n\n", expiry, "\n", filename]),
sha
)
signature = urllib.quote_plus(base64.encodestring(h.digest()).strip())
return "".join([
"https://s3.amazonaws.com",
filename,
"?AWSAccessKeyId=",
current_app.config.get("S3_ACCESS_KEY", None),
"&Expires=",
expiry,
"&Signature=",
signature
])
这给了我一些https://s3.amazonaws.com/bucket_name/path_to_file?AWSAccessKeyId=xxxxx&Expires=5555555555&Signature=eBFeN32eBb2MwxKk4nhGR1UPhk%3D的效果。不幸的是,出于安全原因,我无法将密钥存储在配置文件中。出于这个原因,我切换到 IAM 角色。现在,我使用以下方法获取密钥:
_iam = boto.connect_iam()
S3_ACCESS_KEY = _iam.access_key
S3_SECRET_KEY = _iam.secret_key
但是,这给了我错误“您提供的 AWS 访问密钥 ID 在我们的记录中不存在。”。根据我的研究,我了解到这是因为我的 IAM 密钥不是实际密钥,而是与令牌一起使用。因此,我的问题是双重的:
如何以编程方式获取令牌?似乎没有我可以使用的简单 iam 属性。
如何在签名中发送令牌?我相信我的签名最终应该看起来像 "".join(["GET\n\n\n", expiry, "\n", token, filename]),但我不知道要使用什么格式.
任何帮助将不胜感激。