3

ハードコードされたアクセスキーとシークレットキーが存在する場合、ユーザーがS3でプライベートファイルを表示するための認証済みURLを生成することができました。これは次のコードで行われました。

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キーが実際のキーではなく、トークンとともに使用されているためであることがわかりました。したがって、私の質問は2つあります。

  1. プログラムでトークンを取得するにはどうすればよいですか?私が使用できる単純なiamプロパティはないようです。

  2. 署名でトークンを送信するにはどうすればよいですか?署名は"".join(["GET \ n \ n \ n"、expiry、 "\ n"、token、filename])のようになるはずですが、使用する形式がわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1

5

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>')

どのバージョンを使用していますか?

于 2013-01-11T23:56:37.443 に答える