方法调用以获得预先签名的网址给出不一致的结果(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)

下一篇: WS eb init missing equal