2

我正在尝试生成带有一些用户数据的预签名 url,据我所知,我需要使用自定义请求标头

GeneratePresignedUrlRequest generatePresignedUrlRequest =
    new GeneratePresignedUrlRequest(bucket, objectKey)
        .withMethod(httpMethod)
        .withExpiration(expiration);
if (params != null) {
  params.forEach(
      (k, v) ->
          generatePresignedUrlRequest.putCustomRequestHeader(
              Headers.S3_USER_METADATA_PREFIX + k.toLowerCase(), v));
}
return s3.generatePresignedUrl(generatePresignedUrlRequest);

即使生成的 url 的使用者需要设置标头。有什么办法可以强制消费者添加这些标题?例如:当所需的标头(自定义)不存在时抛出错误请求(400)

4

1 回答 1

2

你看过addRequestParameter吗?这将添加查询字符串参数,如果没有这些参数,请求将失败。

例如

generatePresignedUrlRequest.addRequestParameter(Headers.S3_USER_METADATA_PREFIX + "test", "true");

生成的 url 将包含以下参数:

https://aws-domain/file.ext?x-amz-meta-test=true&X-Amz-Security-Token=<TOKEN>

更新:

我一直在 Node.js 中使用getSignedUrl API在查询字符串参数中生成带有用户元数据的签名 url。我不是 JAVA 开发人员,这就是为什么我建议您使用addRequestParameter它似乎可以使用方法中提供的元数据生成签名 url。

Node.js 代码

const url = s3.getSignedUrl('putObject', {
  'Bucket': 'my-bucket',
  'Key': 'signed.json',
  'Metadata': {
    'my-id': '1234'
  }
});

签名网址

https://my-bucket.s3.eu-west-1.amazonaws.com/signed.json?AWSAccessKeyId=<AccessKey>&Expires=1549497606&Signature=<SignatureKey>&x-amz-meta-my-id=1234

上传文件

curl -k -X PUT -T "signed.json" "https://my-bucket.s3.eu-west-1.amazonaws.com/signed.json?AWSAccessKeyId=<AccessKey>&Expires=1549497606&Signature=<SignatureKey>&x-amz-meta-my-id=1234"

用户元数据

在此处输入图像描述

客户端无需添加任何标头即可添加用户元数据。如果客户端尝试修改 x-amz-meta-* 或删除它,他们将得到SignatureDoesNotMatch您想要的。

修改 x-amz-meta-my-id

curl -k -X PUT -T "signed.json" "https://my-bucket.s3.eu-west-1.amazonaws.com/signed.json?AWSAccessKeyId=<AccessKey>&Expires=1549497606&Signature=<SignatureKey>&x-amz-meta-my-id=123"

预期错误:

<?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><AWSAccessKeyId>AKIAJ5PO6T7F772ZPSPQ</AWSAccessKeyId>
于 2019-02-06T11:32:09.883 回答