我正在尝试生成带有一些用户数据的预签名网址, 据我了解,我需要使用自定义请求标头
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的使用者需要设置标题。 有什么方法可以强制使用者添加这些标头? 例如:当所需的标头(自定义)不存在时,抛出Bad Request(400)
答案 0 :(得分:0)
您看过addRequestParameter吗?这将添加查询字符串参数,并且没有这些参数的请求将失败。
例如
generatePresignedUrlRequest.addRequestParameter(Headers.S3_USER_METADATA_PREFIX + "test", "true");
生成的网址将包含以下参数:
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'
}
});
签名URL :
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>