jmu*_*mer 3 amazon-s3 amazon-iam
当我使用硬编码的访问密钥和密钥时,我能够为用户生成经过身份验证的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
])
Run Code Online (Sandbox Code Playgroud)
这给了我一些影响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
Run Code Online (Sandbox Code Playgroud)
但是,这给了我错误"您提供的AWS访问密钥ID在我们的记录中不存在.".从我的研究中,我知道这是因为我的IAM密钥不是实际密钥,而是与令牌一起使用.因此,我的问题是双重的:
如何以编程方式获取令牌?似乎没有一个简单的iam属性我可以使用.
如何在签名中发送令牌?我相信我的签名最终应该看起来像"".join(["GET \n \n \n",有效期,"\n",令牌,文件名]),但我无法弄清楚要使用的格式.
任何帮助将不胜感激.
https://github.com/boto/boto/commit/99e14f3df039997f54a5377cb6aecc83f22c2670(2012年 6月)中的generate_url方法发生了变化,可以使用会话凭据对URL进行签名.这意味着您需要使用boto版本2.6.0或更高版本.如果你是,你应该能够这样做:
import boto
s3 = boto.connect_s3()
url = s3.generate_url(expires_in=3600, method='GET', bucket='<bucket_name>', key='<key_name>')
Run Code Online (Sandbox Code Playgroud)
你用的是什么版本?
| 归档时间: |
|
| 查看次数: |
1690 次 |
| 最近记录: |