當我使用我的硬編碼訪問密鑰和密鑰時,我能夠生成經過身份驗證的URL,供用戶在S3上查看私人文件。這是用下面的代碼完成:如何使用IAM角色生成已驗證的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」,過期,「\ n」,令牌,文件名]),但是我找不出要使用的格式。
任何幫助將不勝感激。
謝謝,那肯定做到了。我讀過的所有表格都表示無效,但它們已過時。對於任何有興趣的人,您仍然可以使用上述方法完成此項工作,並將查詢字符串中的標記添加爲「x-amz-security-token」。 – jmulmer