【问题标题】:Properly enabling security for filepicker.io in Meteor在 Meteor 中正确启用 filepicker.io 的安全性
【发布时间】:2013-08-31 09:36:49
【问题描述】:
默认情况下,Filepicker 允许几乎每个人都可以将文件添加到您的 S3 存储桶中,这些人足够聪明,可以将您的 API 密钥从客户端代码中复制出来,幸运的是还提供了一个带有过期策略的安全选项。
但我不知道如何在 Meteor.js 中实现这一点。来回尝试,安装meteor-crypto-base 包,尝试在服务器上生成哈希,在https://github.com/RGBboy/urlsafe-base64 上尝试了RGBboy 的urlsafe-base64 算法。但我只是没有进一步。也许有人可以帮忙!提前谢谢你。
【问题讨论】:
标签:
node.js
amazon-s3
meteor
filepicker.io
cryptojs
【解决方案1】:
这是一个基于文档here 的如何在流星中执行文件选择器签名 URL 的示例:
var crypto = Npm.require('crypto');
var FILEPICKER_KEY = 'Z3IYZSH2UJA7VN3QYFVSVCF7PI';
var BASE_URL = 'https://www.filepicker.io/api/file';
Meteor.methods({
signedUrl: function(handle) {
var expiry = Math.floor(new Date().getTime() / 1000 + 60 * 60);
var policy = new Buffer(JSON.stringify({
handle: handle,
expiry: expiry
})).toString('base64');
var signature = crypto
.createHmac('sha256', FILEPICKER_KEY)
.update(policy)
.digest('hex');
return BASE_URL + "/" + handle +
"?signature=" + signature + "&policy=" + policy;
}
});
请注意,这需要存在于您的 server 目录中的某个位置,因此您不会将密钥发送给客户端。为了证明它有效,在客户端你可以这样调用它:
Meteor.call('signedUrl', 'KW9EJhYtS6y48Whm2S6D', function(err, url){console.log(url)});
如果一切正常,您应该在访问返回的 URL 时看到一张照片。