Java Amazon SDK预设url bug或不正确的实现?

时间:2012-07-18 03:01:53

标签: java amazon-s3 amazon-web-services

我只是想知道这是一个错误还是我错误地使用了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 Signature Tester签署相同的请求,我会得到一个不同的“签名”

  

签名= ztp2nD6gVurYhAvQojpZhReSuwE%3D

然而,这个工作正常,发送PUT请求将返回200响应并创建对象。

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

由于

2 个答案:

答案 0 :(得分:0)

您的代码可能存在错误:

generatePresignedUrlRequest.setExpiration(expiration);
// Next line should use the 'generatePresignedUrlRequest' object
URL url = s3.generatePresignedUrl(generatePresignedUrlRequest);

答案 1 :(得分:0)

我不是百分百肯定,但我相信这个问题与以下事实有关:在发送请求时,URL中的签名还必须包含对象类型和格式,而我用来检查的程序会自动添加charset字段,即使它是一个图像。

所以将这个“PUT \ n \ nimage / jpeg; charset = UTF-8 \ n”添加到要签名的URL似乎已经解决了这个问题。