Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 如何使用IAM角色生成经过身份验证的S3 URL?_Amazon S3_Amazon Iam - Fatal编程技术网

Amazon s3 如何使用IAM角色生成经过身份验证的S3 URL?

Amazon s3 如何使用IAM角色生成经过身份验证的S3 URL?,amazon-s3,amazon-iam,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",

当我有硬编码的访问密钥和密钥时,我能够生成经过身份验证的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
])
这给了我一些影响。不幸的是,出于安全原因,我无法在配置文件中存储密钥。出于这个原因,我切换到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]),但我不知道使用什么格式


  • 任何帮助都将不胜感激。

    在(2012年6月)中对
    生成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>')
    
    导入boto
    s3=boto.connect_s3()
    url=s3.generate\u url(expires\u in=3600,method='GET',bucket='',key='')
    

    您使用的是什么版本?

    谢谢,确实是这样。我读过的所有表格都说这行不通,但它们已经过时了。对于任何感兴趣的人,您仍然可以使用我上面的方法来完成这项工作,并将令牌作为“x-amz-security-token”添加到查询字符串中。