方法调用以获得预先签名的网址给出不一致的结果(S3)
我正在使用AmazonS3Client类的generatePresignedUrl方法来获取预先签名的URL。 但是,当该方法在与文件上载相同的会话中调用时。 它返回表单的url:
https://mp-dev.downloads.XYZ.com.s3.ap-south-1.amazonaws.com/certificate/404/17_04_2017/XYZ/ITHLUaXYPnMmHEUbK9L21KBneJQy7oJ1jw.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256&X- AMZ-日期= 20170417T090656Z&X-AMZ-SignedHeaders =宿主&X-AMZ-过期= 900&X-AMZ-凭证= ASDFSFFGODQ%2F20170417%2Fap南-1%2Fs3%2Faws4_request&X-AMZ-签名= 9b2e112608c46cbeb16ff577b6e1321f889efsdfdsc850212251b231cb909d1942
但是当我重新运行我的API并用相同的参数调用相同的方法时,我得到了表单的url:
https://mp-dev.downloads.XYZ.com.s3.amazonaws.com/certificate/404/17_04_2017/XYZ/ITHLUaXYPnMmHEUbK9L21KBneJQy7oJ1jw.zip?AWSAccessKeyId=AKIAJFAFDTTISR4UHODQ&Expires=1492421420&Signature=CZuY1acATGUEEpoXN8aEQFXLX18%3D
第一个Url正常工作,但第二个Url的结果是:
您提供的授权机制不受支持。 请使用AWS4-HMAC-SHA256。
根据以下讨论,我尝试将配置更改为使用签名版本4:
您提供的授权机制不受支持。 请使用AWS4-HMAC-SHA256
但不起作用。 询问是否需要其他信息。
生成网址的端点:
@SkipAuthentication
@GET
@Path("/xyz")
public String download(@QueryParam("cer") String objectKey) {
return testService.test(objectKey).toString();
}
服务测试方法:
public URL test(String objectKey) {
return awsDownloadService.generateDownloadUrl(objectKey, awsServer.getDownloadsBucketName());
}
generateDownloadUrl方法如下所示:
public URL generateDownloadUrl(String keyName, String bucketName) {
LOG.info("generateDownloadUrl - {} {} {} {}>",accessKeyId, secretAccessKey, keyName, bucketName);
BasicAWSCredentials awsCreds = new BasicAWSCredentials(accessKeyId, secretAccessKey);
AmazonS3Client s3Client = new AmazonS3Client(awsCreds);
Date expiration = new Date();
long msec = expiration.getTime();
msec += 1000 * 60 * 15; // 15 minutes.
expiration.setTime(msec);
GeneratePresignedUrlRequest generatePresignedUrlRequest =
new GeneratePresignedUrlRequest(bucketName, keyName);
generatePresignedUrlRequest.setMethod(HttpMethod.GET); // Default.
generatePresignedUrlRequest.setExpiration(expiration);
URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);
LOG.info("GeneratePreAuthenticatedUrl - url generated is <{}>",url);
return url;
}
当我使用upload方法上传文件,然后调用终点来生成url时,它可以正常工作,但是当我重新启动api并调用终点来生成url时,将返回不同的url,如前面在问题中所述。
解决方案和新查询:
我已经解决了这个问题。 显然, AmazonS3Client
已被弃用。 以这种方式让客户始终如一地工
AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(awsCreds));
builder.setRegion(Regions.AP_SOUTH_1.getName());
AmazonS3 s3client = builder.build();
尽管如此, AmazonS3Client
之前展示的行为有点奇怪。 任何人都可以提供早期行为的解释吗?
显然, AmazonS3Client
类在最新的JDK中已弃用。 以下面的方式创建客户端解决了问题,因为它也考虑了区域,因此附加了正确的签名版本:
BasicAWSCredentials awsCreds = new BasicAWSCredentials(accessKeyId, secretAccessKey);
AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(awsCreds));
builder.setRegion(regionName);
AmazonS3 s3client = builder.build();
链接地址: http://www.djcxy.com/p/39041.html
上一篇: Method call to get pre signed urls giving inconsistent results (S3)