2014-11-23 97 views
3

我希望能够向客户端提供“已签名”的URL,因此仅与24小时(例如)有关。 不过,我不想叫S3为生成的每个网址:Amazon S3在存储桶级别的安全URL

AWS::S3::S3Object.new(bucket, name).url_for(:read, :secure => true, :expires => expires_in).to_s 

相反,我想通过生成自己的URL(我有文件名和铲斗连杆,我可以建立它自己) 。

但是,我想在桶级别签名url(例如,给定存储桶中所有文件的每天一次)。这可能吗?

回答

3

创建预签名URL时,完全在本地完成。你可以“自己做”,但使用SDK要容易得多,并且没有实际的差异。请参阅S3 API上没有“签名”操作。

但是,您无法在“存储桶级别”进行签名,因为每个对象都会检查签名。我相信签下一整桶并不可行。

+1

我上面提取的这一行是一个真正的亚马逊调用来获得签名的令牌。据我所知,它不是本地的。 – 2014-11-23 16:45:50

+1

您可以监控您的网络或检查源代码(https://github.com/aws/aws-sdk-ruby/blob/b54a5561180c7eaae14e2a8ac440ce4a48c8de8f/lib/aws/s3/s3_object.rb),此方法调用在本地解决,并且不调用远程服务。 – 2014-11-23 16:58:54

+2

我的天啊。我有一个“bucket.blank?”在我的代码中,这是什么触发了AWS调用 - https://github.com/aws/aws-sdk-ruby/blob/b54a5561180c7eaae14e2a8ac440ce4a48c8de8f/lib/aws/s3/bucket.rb#L252我甚至没有考虑这......谢谢。 – 2014-11-23 18:50:23

0

对不起,我没有Ruby代码为这只Java的...

但你将无法获得presigned网址为全斗,只有每个文件。

这是我创建的功能。这将为您打印所有内容。这个过程是否有意义?

private static URI GetURL(AmazonS3Client amazonS3Client, S3ObjectSummary s3ObjectSummary) throws URISyntaxException { 
    return amazonS3Client.generatePresignedUrl(
      new GeneratePresignedUrlRequest(s3ObjectSummary.getBucketName(), s3ObjectSummary.getKey()) 
      .withMethod(HttpMethod.GET) 
      .withExpiration(GetExperation())).toURI(); 
} 

public static void run(String accessKey, String secretKey, String bucketName) { 

    AmazonS3Client amazonS3Client = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey)); 
    amazonS3Client.listObjects(bucketName) 
      .getObjectSummaries() 
      .stream() 
      .forEach(s3ObjectSummary 
        -> System.out.println(GetURL(amazonS3Client, s3ObjectSummary).toString())); 
} 
相关问题