繁体   English   中英

aws-sdk v3 中 aws-sdk v2 中 Aws::S3::Presigner#presigned_request 的替代方案

[英]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存在

https://xxxxxxxxxxx.s3.amazonaws.com/mypath/myfile.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAJILKMM53N2D4HKKA/20210114/us-east-1/s3/aws4_request&X日期=20210114T154613Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host;x-amz-server-side-encryption-customer-algorithm;x-amz-server-side-encryption-customer-key;x-amz-server- side-encryption-customer-key-md5&X-Amz-Tagging=param=value&X-Amz-Signature=f7f4c5752cb181bf0d8d1134b4a9add9ecad15116f26dd5979b992db87060498

该值应为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM