当前位置: 首页 > 知识库问答 >
问题:

方法调用以获取给出不一致结果的预签名URL(S3)

淳于凯
2023-03-14

我正在使用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-date=20170417t090656z&x-amz-signedheaders=host&x-amz-expires=900&x-amz-credential=asdfsffgodq%2f20170417%2fap-south-1%2fs3%2faws4_request&x-amz-south-1%2fs3%2faws4_request-签名=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());
  }
  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;
  }
AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(awsCreds));
    builder.setRegion(Regions.AP_SOUTH_1.getName());
    AmazonS3 s3client = builder.build();

尽管如此,前面展示的amazons3client行为还是有点奇怪的。谁能解释一下以前的行为吗?

共有1个答案

云宏儒
2023-03-14

最近的SDK中显然不推荐使用Amazons3Client类。以以下方式创建客户端解决了这个问题,因为它还考虑了区域,并因此附加了适当的签名版本:

BasicAWSCredentials awsCreds = new BasicAWSCredentials(accessKeyId, secretAccessKey);
    AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(awsCreds));
    builder.setRegion(regionName);
    AmazonS3 s3client = builder.build();
 类似资料:
  • 标题说明一切。这是我的代码; 我使用节点强大的文件。 成功上传后,url变量返回s3 url,类似以下内容; 下面是我的参数 我错过了什么?

  • 我正在尝试研究如何将6个随机生成的数字添加到HashSet中。我得到了结果,但结果不一致。有时它会将6个数字打印到控制台,有时它会打印5个数字到控制台。 我是今天早上才开始接触这种东西的,所以如果很明显,我道歉,并感谢你的帮助。

  • 我试图上传图像/视频使用PHP/Javascript到AWS S3 这是我的PHP代码 这是我的Java脚本代码 所有这些功能工作伟大,我想即使在执行它给我文件上传成功消息too.but当我检查s3什么都没有。 即使在控制台中,它也会像下面一样生成预签名URL。但当我尝试单击它时,它会给我SignatureDesNotMatch错误。(请单击URL)。可能是什么错误。。? https://ibra

  • 问题内容: 我有以下对象: 我在以下使用它: 现在,树形图用于一个称为的类中,用于存储图形中当前存在的节点以及它们的边集(来自class )。我的问题是当我尝试执行时: 我有时会得到以下信息: 哈希码:true等于:true包含: false N:foo X:foo比较数:0 有人知道我在做什么错吗?我对这一切仍然是陌生的,所以如果我忽略了一些简单的事情,我会事先道歉(我知道这并不重要,但我想我会

  • 如果你想把自己的资源发放给第三方用户访问,但是又不想开放Bucket的读权限,可以通过生成预签名URL的形式提供给用户一个临时的访问URL。在生成URL时,你可以指定URL过期的时间,从而限制用户长时间访问。 生成一个预签名的URL 如下代码: String bucketName = "your-bucket-name"; String key = "your-object-key"; // 设

  • 如果你想把自己的资源发放给第三方用户访问,但是又不想开放Bucket的读权限,可以通过生成预签名URL的形式提供给用户一个临时的访问URL。在生成URL时,你可以指定URL过期的时间,从而限制用户长时间访问。 生成预签名URL来获取Object <?php $url = $client->generatePresignedUrl(array( 'Bucket' => 'your-buck