【发布时间】:2017-08-29 02:02:22
【问题描述】:
我有一个使用 EmberJS 构建的前端客户端,特别是 ember-uploader 来处理将文件直接上传到 S3。我卡住的地方是,在请求发送到亚马逊之前,我似乎无法使用我的后端服务器(A java Dropwizard 微服务)正确签署请求。
我知道我可以创建一个GeneratePresignedUrlRequest,但我使用的前端库特别想要从服务器返回一个 json 对象,所以我试图将 GeneratePresignedUrlRequest 拆分为一个对象。
目前一切似乎都很好,但我错过了policy,因为我无法锻炼如何正确创建它。
private SignRequestObject createSignRequestObject(List<NameValuePair> valuePairs) {
SignRequestObject request = new SignRequestObject();
request.setKey("test.txt");
request.setBucket("test-bucket");
request.setPolicy("?");
for (NameValuePair pairs : valuePairs) {
if (pairs.getName().equals("X-Amz-Credential")) {
request.setCredentials(pairs.getValue());
}
if (pairs.getName().equals("X-Amz-Signature")) {
request.setSignature(pairs.getValue());
}
if (pairs.getName().equals("X-Amz-Algorithm")) {
request.setAlgorithm(pairs.getValue());
}
if (pairs.getName().equals("X-Amz-Date")) {
request.setDate(pairs.getValue());
}
}
return request;
}
valuePairs 来自GeneratePresignedUrlRequest
private String createSignedUrl() {
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest("test-bucket", "test.txt");
generatePresignedUrlRequest.setMethod(HttpMethod.PUT);
return amazonS3.generatePresignedUrl(generatePresignedUrlRequest).toString();
}
根据 ember-uploader 的 wiki,我希望策略对象看起来像:
// Ruby example, but shouldn't matter
{
expiration: @expires,
conditions: [
{ bucket: 'sandbox' },
{ acl: 'public-read' },
{ expires: @expires },
{ success_action_status: '201' },
[ 'starts-with', '$key', '' ],
[ 'starts-with', '$Content-Type', '' ],
[ 'starts-with', '$Cache-Control', '' ],
[ 'content-length-range', 0, 524288000 ]
]
)
我应该尝试自己构建它还是 aws-sdk 有用于此的方法?我经常看到AWS Signature Version 4,但也不知道如何使用它。
尝试通过浏览器上传时,我收到了来自亚马逊的 403。
【问题讨论】:
-
我强烈推荐使用 Jets3t。
-
您能否详细说明 jets3t 的哪一部分适用?我通过文档看到的最接近的是 S3 POST 表单,这是我所追求的,但我不想通过后端服务呈现表单
-
我强烈建议使用后端至少创建签名,在这种情况下,您将使用任何必要的参数向服务器发送 AJAX 帖子,服务器将签名发回,然后您将组合的表单和签名提供给您的客户端上传器。
-
在 Jet3ts API 中找不到任何可以让我在不创建完整表单对象的情况下创建签名的地方。您能否提供代码示例或指向 API 中可以执行此操作的位置的链接?
-
嗨,我正处于一个类似的难题中,我的 Java 端工作基于 Amazon 提供的这些 Signature Calculation Examples Using Java (AWS Signature Version 4)。对于客户来说,这是一个两步的过程。 1) 客户端向后端应用程序询问签名版本 4“策略”。 2) 客户端使用该策略根据Browser-Based Uploads Using POST POST 到 S3
标签: java amazon-web-services amazon-s3 aws-sdk