我只是想知道这是一个错误还是我错误地使用了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吗?或者为什么签名不同。
由于
答案 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似乎已经解决了这个问题。