わかりましたので、私はそれを得ました。署名を作成する際に考慮すべき2つの非常に重要なことがあります。 A)署名の計算方法、およびB)バケットポリシーの設定方法。あなたのCORSが投稿を許可するように設定されていて、あなたのIAMユーザ/グループがs3アクセス権を持っていると仮定しています。実際にはs3アクセスのみが必要です。
フォームデータのためのバケットポリシーが必要です。 ["starts-with", "$key", "{{intended_file_path}}"]
、 "x-amz-credential"
、 "x-amz-algorithm"
、 "x-amz-date"
、 "bucket"
["starts-with", "$key"
意図したファイルの保存先のパスでなければなりません - すなわち、 "アップロード"、または「ユーザーを/ jack/"、または" images "、何でも - 以下の例を参照してください。
私の署名とバケットポリシーに署名した方法は次のとおりです。
バケツ設定:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Allow Get",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::example-development/*"
},
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789:user/example"
},
"Action": "s3:*",
"Resource": ["arn:aws:s3:::example-development/*","arn:aws:s3:::example-development"]
}
]
}
は、バックエンド:
def string_to_sign
@time = Time.now.utc
@time_policy = @time.strftime('%Y%m%dT000000Z')
@date_stamp = @time.strftime('%Y%m%d')
ret = {"expiration" => 10.hours.from_now.utc.iso8601,
"conditions" => [
{"bucket" => ENV["aws_bucket"]},
{"x-amz-credential": "#{ENV["aws_access_key"]}/#{@date_stamp}/us-west-2/s3/aws4_request"},
{"x-amz-algorithm": "AWS4-HMAC-SHA256"},
{ "acl": "public-read" },
{"x-amz-date": @time_policy },
["starts-with", "$key", "uploads"],
]
}
@policy = Base64.encode64(ret.to_json).gsub(/\n|\r/, '')
end
def getSignatureKey
kDate = OpenSSL::HMAC.digest('sha256', ("AWS4" + ENV["aws_secret_key"]), @date_stamp)
kRegion = OpenSSL::HMAC.digest('sha256', kDate, 'us-west-2')
kService = OpenSSL::HMAC.digest('sha256', kRegion, 's3')
kSigning = OpenSSL::HMAC.digest('sha256', kService, "aws4_request")
end
def sig
sig = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), getSignatureKey, @policy).gsub(/\n|\r/, '')
end
それはあなたが使用している署名Bersionに依存します。一般的なバージョンはV2(base64)とV4(hex)です。実装しようとしていることについては、ドキュメントにリンクしてください。おそらくこれを明確にすることができます。 –
Ahh okay私はs3への投稿でv4をやっています –