0

我只是想知道这是一个错误还是我错误地使用了 sdk。

Presigned URL 生成代码如下:

java.util.Date expiration = new java.util.Date();
long milliSeconds = expiration.getTime();
milliSeconds += 1000 * 60 * 60; // Add 1 hour.
expiration.setTime(milliSeconds);

URL url = s3.generatePresignedUrl(userPicturesBucket, "walala", expiration, HttpMethod.PUT);

但这会在“签名”错误的地方生成一个预签名的 ulr。

签名=7iw7DfZ3Ed24kQpsV5Hp9VrJ%2BMo%3D

我可以通过使用 RESTClient 在完整地址上发送 PUT 请求来测试这一点。我会收到一个禁止回复,说SignatureDoesNotMatch

但是,如果我使用Amazon S3 签名测试器签署相同的请求,我将获得不同的“签名”

签名=ztp2nD6gVurYhAvQojpZhReSuwE%3D

然而,这个确实有效,发送 PUT 请求将返回 200 响应,并且将创建对象。

我的问题是,这是针对 java 错误的亚马逊 sdk 吗?或者为什么签名不同。

谢谢

4

2 回答 2

0

您的代码中可能存在错误:

generatePresignedUrlRequest.setExpiration(expiration);
// Next line should use the 'generatePresignedUrlRequest' object
URL url = s3.generatePresignedUrl(generatePresignedUrlRequest);
于 2012-07-18T03:07:38.290 回答
0

我不是 100% 确定,但我认为问题与以下事实有关:在发送请求时,url 中的签名还必须包括对象类型和格式,并且我用来检查的程序会自动添加字符集字段,即使这是一个图像。

因此,将此 "PUT\n\nimage/jpeg; charset=UTF-8\n" 添加到要签名的 URL 似乎已经解决了问题。

于 2012-08-10T05:58:15.503 回答