我有一个应用程序,用户可以上传某些数字商品。其他用户可以购买这些,在这种情况下,紧接着呈现下载链接,同时发送包含相同链接的电子邮件。此链接应在7天后过期
现在,当用户上传他们的项目时,它会上传到S3并且URL存储在Items集合中。
问题是,我不想给客户这个直接链接,因为那时我没办法让它过期。相反,我想在购买时创建一个引用原始S3网址的新网址,然后将此链接发送给客户
我认为我可以制作某种url缩短功能,但不确定这是否是最有效的
知道如何在不泄露原件的情况下完成此操作吗?
答案 0 :(得分:3)
一种选择是让您的应用程序管理s3对象=人们可以下载的文件的“读取策略”。您可以设置策略的到期日期。
在我的流星应用程序中,我正在使用此库: https://github.com/arbitrarytech/s3policy
在服务器上:
Meteor.methods({
get_s3_read_policy: function(_key,_filename) {
var SECONDS_BEFORE_TIMEOUT = 1000;
var s3 = new s3Policies( CONFIG.aws_access_key , CONFIG.aws_secret_access_key );
var signedURL = s3.readPolicy( _key, 'your_bucket_name' , SECONDS_BEFORE_TIMEOUT , _filename);
return signedURL;
}
});
在您的情况下,您可能只需要签名的URL。在我的客户端应用程序中,这是我开始下载的方式。
Meteor.call('get_s3_read_policy', key, filename , function(err,_signedURL) {
if (err){
console.log("Error retrieving the signed url for download ", err);
}else{
window.open(_signedURL,"_self");
}
});
因此,我认为可以直接通过电子邮件向用户发送此签名的URL,如果它过期,用户将看到错误而无法访问该资源。我读到在s3中甚至有一种方法可以向用户显示一个很好的错误页面custom 404 page for missing object in s3 temporary signed URL,但我还没有尝试过。
答案 1 :(得分:0)
客户端可以发现引用其他URL的任何URL,这就是HTTP:允许客户端导航资源并了解其当前位置或状态。如果您提供中介,它可以将真实的URL内容传递给客户端,您可以控制可见性和生命周期,因为客户端永远不会直接与资源通信。您可以通过编写散列真实URL的中间件或简单地为其提供密钥并随后向引用中介的客户端提供新URL来轻松实现此目的。
答案 2 :(得分:0)
不确定我是否正确解释了这个问题,但也许你可以使用像TinyURL API这样的东西?
http://www.tiny-url.info/open_api.html
(网站示例)
$lurl = $_POST['long_url'];
$curl = curl_init();
$post_data = array('format' => 'json',
'apikey' => 'YOUR_API_KEY',
'provider' => 'PROVIDER_STRING',
'url' => $lurl );
$api_url = 'http://tiny-url.info/api/v1/create';
curl_setopt($curl, CURLOPT_URL, $api_url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
$result = curl_exec($curl);
curl_close($curl);
echo $result;
另一种方法是以编程方式拥有重定向链接?根据你使用的后端,这会有所不同,但看起来如下:
For the route xxxx/<account/digitalgood_id>/<date>:
if date is older than a week:
say it is expired
otherwise:
redirect to page/<account/digitalgood_id> which accesses to the S3 info