将url链接到其他网址

时间:2015-02-20 18:01:04

标签: javascript meteor

我有一个应用程序,用户可以上传某些数字商品。其他用户可以购买这些,在这种情况下,紧接着呈现下载链接,同时发送包含相同链接的电子邮件。此链接应在7天后过期

现在,当用户上传他们的项目时,它会上传到S3并且URL存储在Items集合中。

问题是,我不想给客户这个直接链接,因为那时我没办法让它过期。相反,我想在购买时创建一个引用原始S3网址的新网址,然后将此链接发送给客户

我认为我可以制作某种url缩短功能,但不确定这是否是最有效的

知道如何在不泄露原件的情况下完成此操作吗?

3 个答案:

答案 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