是否可以使用Amazon S3共享选择用户的文件

时间:2011-10-07 13:19:47

标签: amazon-s3

我的S3存储桶中的文件很少。是否可以与选定的用户共享它们。那些人可能没有Amazon S3帐户。我知道如果我公开,每个人都可以使用URL下载文件。

我想要一些加密的URL或一个URL,当它被点击时会立即询问一些用户名和密码。

而且我也不想安装任何人安装的新/第三方软件。

由于

3 个答案:

答案 0 :(得分:7)

绝对

您可以制作文件private,然后为文件生成time expiring signed urls

签名的网址是使用您的公钥和密钥生成的,并且设置为在将来的指定时间到期。

根据您使用的技术,使用AWS SDKS之一生成网址可能最简单。

签名网址如下:

http://[bucket].s3.amazonaws.com/[key]?AWSAccessKeyId=[AWS_Public_Key]&Expires=1294766482&Signature=[generated_hash]

我在this answer中详细解释了这些网址。

答案 1 :(得分:1)

以下是一个示例ruby代码,用于为存储桶中的特定位置生成签名网址。

安装aws-sdk

gem install aws-sdk

创建一个新文件,根据需要为其命名,我选择shareS3files.rbgist.github.com上查看:

#!/usr/bin/env ruby

require 'aws-sdk'
require 'json'

#loading credentials
creds = JSON.load(File.read('secrets.json'))
creds = Aws::Credentials.new(creds['AccessKeyId'], creds['SecretAccessKey'])

#loading config
conf = JSON.load(File.read('config.json'))

# Create a new S3 object
s3 = Aws::S3::Client.new(credentials: creds, region: conf['Region'])

# Create a resource object, simpler to use
resource = Aws::S3::Resource.new(client: s3)
bucket = resource.bucket(conf['Bucket'])

# enumerate every object in a bucket, and create a pre signed url with a 5 days expiration limit
bucket.objects(prefix: 'conf['Location']').each do |obj|
  puts "#{obj.key} => #{obj.object.presigned_url(:get, expires_in: 5 * 24 * 60 * 60)}"
end

现在,创建凭证和配置文件:

secrets.json

{
  "AccessKeyId": "TOCHANGE",
  "SecretAccessKey": "TOCHANGE"
}

config.json

{
  "Region": "TOCHANGE",
  "Bucket": "tochange",
  "Location": "to/change/"
}

进一步的aws和ruby doc:

答案 2 :(得分:1)

如果安装了AWS CLI,则只需使用presign

aws s3 presign s3://[bucket]/[path_filename]

您还可以将链接设置为在24小时后失效86400 = (60 * 60 * 24))

aws s3 presign s3://[bucket]/[path_filename] --expires-in 86400