[英]aws-sdk for Ruby v2: check success status after I PUT object in S3 bucket
[英]Alternative for Aws::S3::Presigner#presigned_request in aws-sdk v3 in aws-sdk v2
Ruby aws-sdk v3 在 Aws::S3::Presigner class 中具有presigned_request 方法。 它用于签署请求。 但在 aws-sdk v2 中, presign_request不可用。 我正在尝试为预签名的 URL 签署额外的标头。 有办法吗?
@Samtoddler
此问题的主要目的是为 a:put request presigned url 额外签名“x-amz-tagging”,我尝试通过添加额外的 header 来修改您的代码
class Aws::Signers::V4
def presigned_url(request, options = {})
now = Time.now.utc.strftime("%Y%m%dT%H%M%SZ")
body_digest = options[:body_digest] || hexdigest(request.body)
request.headers.delete('User-Agent')
request.headers['Host'] = request.endpoint.host
params = Aws::Query::ParamList.new
params.set("X-Amz-Algorithm", "AWS4-HMAC-SHA256")
params.set("X-Amz-Credential", credential(now))
params.set("X-Amz-Date", now)
params.set("X-Amz-Expires", options[:expires_in].to_s)
params.set("X-Amz-SignedHeaders", signed_headers(request))
params.set("X-Amz-Tagging", 'param=value')
params.set('X-Amz-Security-Token', credentials.session_token) if
credentials.session_token
endpoint = request.endpoint
if endpoint.query
endpoint.query += '&' + params.to_s
else
endpoint.query = params.to_s
end
endpoint.to_s + '&X-Amz-Signature=' + signature(request, now, body_digest)
end
end
当我尝试这个时,我获得的 url 具有“X-Amz-tagging”header:
https://xxxxxxxxxxx.s3.amazonaws.com/mypath/myfile.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAJILKMM53N2D4HKKA%2F20210114%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20210114T154613Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host%3Bx-amz-server-side-encryption-customer-algorithm%3Bx-amz-server-side-encryption-customer-key%3Bx-amz-server-side-encryption-customer-key-md5&X-Amz-Tagging=param%3Dvalue&X-Amz-Signature=f7f4c5752cb181bf0d8d1134b4a9add9ecad15116f26dd5979b992db87060498
但是当我试图向我的客户提出请求时,我得到一个说法:
There were headers present in the request which were not signed
<HeadersNotSigned>x-amz-tagging</HeadersNotSigned>
@samtoddler
这就是我在客户端设置的方式
ObjectiveService.postFilesToAWS = function (presigned_url, file, headers={}) {
return $http({
method: 'PUT',
url: presigned_url,
ignoreLoadingBar: true,
data: file,
headers: {
'Content-Type': file.type,
'X-Amz-Tagging': 'param=value'
}
})
.then(function (response) {
return response;
}, function (error) {
return error;
});
}
相同的客户端代码在 #presigned_request 方法中适用于 aws-sdk v3。
到目前为止,我读到的是错误消息中的 header 可能不是问题,它可能与任何其他 header 以及缺少或没有设置适当的值有关。
您是使用AWS KMS (SSE-KMS) 指定服务器端加密还是使用客户提供的加密密钥进行服务器端加密,因为情况不同,我看到 SSE-C 存在标头,但未指定值。
例如,URL 中的这个 header x-amz-server-side-encryption-customer-algorithm存在
该值应为AES256作为文档。
您生成的 URL 应该是这样的
“https://.s3.amazonaws.com/?X-Amz-Security-Token=&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20180718T013339Z&X-Amz-SignedHeaders=content-type%253Bhost&X-Amz -Expires=1799&X-Amz-Credential=&X-Amz-Signature=
我建议阅读AWS Signature Version 4 Signature Calculation以了解想法以及应该存在哪些标头。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.