【发布时间】:2011-10-07 13:19:46
【问题描述】:
我的 S3 存储桶中的文件很少。是否可以与选定的用户共享它们。这些人可能没有 Amazon S3 帐户。我知道如果我公开,每个人都可以使用 URL 下载文件。
我想要一个加密的 URL 或一个在被点击时立即询问用户名和密码的 URL。
而且我也不想安装任何新的/第三方软件供所有人安装。
谢谢
【问题讨论】:
标签: amazon-s3
我的 S3 存储桶中的文件很少。是否可以与选定的用户共享它们。这些人可能没有 Amazon S3 帐户。我知道如果我公开,每个人都可以使用 URL 下载文件。
我想要一个加密的 URL 或一个在被点击时立即询问用户名和密码的 URL。
而且我也不想安装任何新的/第三方软件供所有人安装。
谢谢
【问题讨论】:
标签: amazon-s3
绝对的。
您可以将您的文件设为private,然后为您的文件生成time expiring signed urls。
签名的 url 使用您的公钥和密钥生成,并设置为在未来的指定时间过期。
根据您使用的技术,使用AWS SDKS 之一生成网址可能最容易。
签名的网址看起来像:
http://[bucket].s3.amazonaws.com/[key]?AWSAccessKeyId=[AWS_Public_Key]&Expires=1294766482&Signature=[generated_hash]
我在this answer 中详细解释了这些网址。
【讨论】:
这是一个示例 ruby 代码,用于为存储桶中的特定位置生成签名 URL。
安装aws-sdk:
gem install aws-sdk
新建一个文件,随便命名,我选shareS3files.rb,看gist.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 文档:
【讨论】: