Amazon S3存储桶级别的安全URL

3

我希望能够向客户提供“签名”的URL,这样只有在24小时内才有效(例如)。 但是,我不想为每个生成的URL调用S3:

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

相反,我想自己生成URL(我有文件名和存储桶链接,可以自己构建URL)。

但是,我想在存储桶级别上对URL进行签名(比如说一天只签名一次给定存储桶中的所有文件)。这个可行吗?

2个回答

3
当您创建预签名URL时,这完全在本地完成。您可以“自己”完成此操作,但使用SDK会更加容易,并且不会有实际区别。请注意,S3 API上没有“签名”操作。
但是,您无法在“存储桶级别”进行签名,因为签名是按对象检查的。我认为签署整个存储桶是不可行的。

1
我提取的这行代码是实际调用亚马逊以获取签名令牌的。据我所见,它不是本地的。 - JAR.JAR.beans
1
您可以监控您的网络或检查源代码(https://github.com/aws/aws-sdk-ruby/blob/b54a5561180c7eaae14e2a8ac440ce4a48c8de8f/lib/aws/s3/s3_object.rb),此方法调用在本地解决,不会调用远程服务。 - Julio Faerman
2
我的天啊。我的代码中有一个"bucket.blank?",这就是触发调用AWS的原因 - https://github.com/aws/aws-sdk-ruby/blob/b54a5561180c7eaae14e2a8ac440ce4a48c8de8f/lib/aws/s3/bucket.rb#L252 我甚至没有考虑到这一点...谢谢。 - JAR.JAR.beans
1
接受了这个答案,因为它纠正了我的错误假设,即调用url_for(secure: true)是一个网络调用。 - JAR.JAR.beans

0

抱歉,我没有 Ruby 代码,只有 Java...

但是你将无法获取整个存储桶的预签名 URL,只能获取每个文件的 URL。

这是我创建的函数。它会为您打印所有内容。这个过程有意义吗?

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()));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接