在请求者付款人存储区中预先签名S3获取对象请求时,SignatureDoesNotMatch

问题描述

仅当存储桶是请求者付款人存储桶时,我才尝试扩展客户端应用程序并遇到问题,尝试为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 (将#修改为@)