我正在使用带有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服务器端的情况一样。
答案 0 :(得分:1)
您可以使用webapp
创建HTTP端点,然后使用node's http
从Filepicker
获取图像,然后将其传递给响应:
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端点。但是,现在这是一个解决方案。