2014-11-23 92 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())); 
}