Filepicker.io with Meteor:如何返回实际资产而不是资产链接

时间:2015-07-29 04:33:21

标签: node.js security meteor server-side filepicker.io

我正在使用带有Meteor应用程序的filepicker.io并正在为我的应用程序开发安全性。 Filepicker提供了对策略创建和签名的支持,但是对于Meteor的服务器端,我觉得为每个请求文件的用户创建过期策略都是过度的。

我想要做的是为用户提供文件的间接链接。服务器通过服务器端路由(铁路由器)拦截此请求,然后服务器通过带有关于所述文件的元数据的文件集合检查用户是否具有该文件的权限。

正如我现在所知,如果用户有权访问,我会向他们提供一个文件链接,其中签名和策略作为该链接的参数。相反,我宁愿只返回图像或文件资产,根本没有链接。例如。服务器端将通过只有服务器知道的链接访问文件或映像,但服务器会将该文件或映像流式传输到客户端,而不共享文件的实际链接。

预期的代码如下所示,我不知道最后该做什么:

@route "file",
  path: "/file/:_id"
  where: "server"
  action: ->
    if @request.cookies.meteor_login_token
      user = Meteor.users.findOne( 
           {"services.resume.loginTokens.hashedToken": 
           Accounts._hashLoginToken(@request.cookies.meteor_login_token)}
      )
    if user
      # the files collection has metadata about each file
      # these files are uploaded through filepicker
      # this include file.url which is the actual link 
      file = share.Files.findOne(
         {_id: @params._id, accessibleBy: user._id}
      )
      if not file 
        @response.writeHead(403)
        @response.end()
        return
      else
        #return the file/image from filepicker, 
        #e.g. file.url without actually returning the url
        @response.end()

在我的研究中,似乎stream可能是解决方案,但是对于我来说,如何在node.js中实现这一点并不明显,就像Meteor服务器端的情况一样。

1 个答案:

答案 0 :(得分:1)

您可以使用webapp创建HTTP端点,然后使用node's httpFilepicker获取图像,然后将其传递给响应:

var http = Npm.require('http'),
    url = Npm.require('url');

WebApp.connectHandlers.use('/file', function(req, res, next) {
    // URL format: /file/:_id
    var id = url.parse(req.url, true).path.substr(1); // this is _id

    // replace the following parameters with filepicker stuff
    http.request({
        host: 'www.devbattles.com',
        path: '/en/images/upload/1427871558.png'
    }, function(result){
        // here we just pipe the http result
        res.writeHead(200, {
            'Content-Type': result.headers['content-type']
        });
        result.pipe(res);
    }).end();
});

如果您要将此代码(例如)复制到/server/filepickerPipe.js,然后打开http://server.com/file/test,则会看到this picture

作为旁注:

有可能通过DDP服务所有这些。我也将不得不开始从第三方提供文件,所以我可能会调查它并创建一个包,只是通过DDP进行,而不是弄乱HTTP端点。但是,现在这是一个解决方案。