问题描述
仅当存储桶是请求者付款人存储桶时,我才尝试扩展客户端应用程序并遇到问题,尝试为S3上的Get Object端点生成预签名的请求URL。
对于上下文,应用程序的相关部分根据访问许可列表提供文件。每个资源的详细信息都存储在本地数据库中。在处理请求时,将创建一个预签名的S3请求以下载资源,并将用户重定向到该资源。资源位于内部和外部存储桶中,具体取决于数据类型和源。
我的更改是支持一个新的客户端,该客户端的请求者为要提供的内容付费。
func GetS3RedirectForResource(bucket,key,name string,requestPayer bool,client *s3.S3) (string,error) {
Now := time.Now()
params := &s3.GetobjectInput{
Bucket: aws.String(bucket),Key: aws.String(key),ResponseContentdisposition: aws.String(`attachment; filename="` + name + `"`),responsecacheControl: aws.String("private"),ResponseExpires: &Now,}
if requestPayer {
params = params.SetRequestPayer(s3.RequestPayerRequester)
}
req,_ := client.GetobjectRequest(params)
urlStr,err := req.Presign(15 * time.Second)
if err != nil {
return "",errors.Wrap(err,"Error getting S3 presigned url")
}
return urlStr,nil
}
我添加的范围是新参数requestPayer
和该部分
if requestPayer {
params = params.SetRequestPayer(s3.RequestPayerRequester)
}
现有代码对公共存储桶以及该帐户拥有的存储桶仍然有效。但是,当引用请求者付费的存储桶时,该功能不起作用。
而是出现错误
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
返回。
我已经仔细检查了在调用req.Send()
时请求是否有效,并且可以从输出流中读取对象内容,因此请求结构有效,并且在需要时调用SetRequestPayer
。 / p>
此问题的常见原因似乎是使用了错误的机密或标题冲突。由于在没有SetRequestPayer
调用的情况下生成的预签名URL继续起作用,因此我认为情况并非如此。
我目前的假设是,我忘记了在签名请求之前调用某些函数或添加其他所需的元素,但是目前我不确定我错过了什么。非常感谢您的协助。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)