新しいフェデレーション トークンを要求する Python コードがあります。
AWS_HOST = 'sts.amazonaws.com'
AWS_URI = '/'
AWS_ID = '...'
AWS_SECRET = '...'
def amazon(content):
URI_String=[]
for keyword, value in sorted(content.items()):
URI_String.append('%s=%s' % (keyword, urllib.quote(value))
req = '&'.join(URI_String)
to_sign_req = 'GET\n%s\n%s\n%s' % (AWS_HOST, AWS_URI, req)
h = hmac.new(AWS_SECRET, to_sign_req, hashlib.sha256)
sig = base64.b64encode(h.digest())
req += '&Signature=%s' % urllib.quote(sig)
baseurl = 'https://sts.amazonaws.com?'
apicall = baseurl + req
r = urllib.urlopen(apicall).read()
return r
そして、私はそのような準備されたコンテンツでそれを使用します:
content['Timestamp'] = dstamp.strftime('%Y-%m-%dT%H:%M:%S.000Z')
content['SignatureVersion'] = '2'
content['AWSAccessKeyId'] = AWS_ID
content['DurationSeconds'] = '3600'
content['SignatureMethod']='HmacSHA256'
content['Version']='2011-06-15'
content['Action']='GetFederationToken'
content['Name']='someFederateduserName'
そして、それはうまくいきます。しかし、ポリシー ( content['Policy']=POLICY
) を追加しようとすると、POLICY =
{
"Statement": [{
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::bucketname/foldername/*"
}]
}
アマゾンはSignatureDoesNotMatch
応答を返します。誰もそれを修正する方法を知っていますか? ポリシーをカスタマイズして連携トークンを発行したい...