好了,我知道了。創建簽名時需要考慮兩件非常重要的事情。 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(十六進制)。請鏈接到您正在嘗試實施的文檔,也許我們可以澄清這一點。 –
啊,好吧,我正在做v4與s3的職位 –