【发布时间】:2013-08-30 20:05:15
【问题描述】:
我正在尝试构建一个允许用户从 NodeJS 支持的网站将文件直接上传到我的 Amazon S3 存储桶的构建。似乎除了 the actual amazon docs for this 之外唯一的教程都已经过时了。
我一直在关注 this tutorial,了解基本信息,但它又过时了。它没有对 crypto 的方法调用正确,因为它试图将原始 JavaScript 对象传递给 update 方法,这会引发错误,因为它不是字符串或缓冲区。
我也一直在寻找 the knox npm package 的来源。它没有内置 POST 支持 - 我完全理解,因为一旦它具有正确的字段,它就是浏览器在执行 POST。 Knox 似乎确实拥有签署政策的正确代码,我试图让我的代码基于此工作......但再次无济于事。
这是我想出的代码。它会生成一个 base64 编码的策略,并创建一个签名……但是当我尝试上传文件时,根据亚马逊的说法,它是错误的签名。
var crypto = require("crypto");
var config = require("../../amazonConfig.json");
exports.createS3Policy = function(callback) {
var date = new Date();
var s3Policy = {
"expiration": "2014-12-01T12:00:00.000Z",
"conditions": [
{"acl": "public-read"},
["content-length-range", 0, 2147483648],
{"bucket": "signalleaf"},
["starts-with", "$Cache-Control", ""],
["starts-with", "$Content-Type", ""],
["starts-with", "$Content-Disposition", ""],
["starts-with", "$Content-Encoding", ""],
["starts-with", "$Expires", ""],
["starts-with", "$key", "/myfolder/"],
{"success_action_redirect": "http://example.com/uploadsuccess"},
]
};
var stringPolicy = JSON.stringify(s3Policy).toString("utf-8");
var buffer = Buffer(stringPolicy, "utf-8");
var encoded = buffer.toString("base64");
var signature = crypto.createHmac("sha1", config.secretKey)
.update(new Buffer(stringPolicy, "utf-8")).digest("base64");
var s3Credentials = {
s3PolicyBase64: encoded,
s3Signature: signature
};
GLOBAL.s3creds = s3Credentials;
callback(s3Credentials);
};
我显然做错了什么,在这里。但我不知道是什么。谁能帮助确定我做错了什么?我的问题在哪里? 是否有人提供有关如何从 NodeJS v0.10.x 生成带有签名的正确 Amazon S3 策略的工作教程,用于 POST 到 s3 REST api?
【问题讨论】:
-
将文件直接上传到 S3 并不是一件容易的事,尤其是如果你想支持分块、自动恢复、用户元数据等。策略的东西可以 相当复杂。考虑使用我维护的库:Fine Uploader。它原生支持在所有浏览器中直接上传到 S3,甚至是 IE7。除其他功能外,还支持分块和自动恢复。此外,我自己写了一个node.js server-side example,当与 Fine Uploader S3 配对时,它将为您处理所有签名。
-
您可以发表此评论作为答案吗?我最终可能会使用你的图书馆。仍在评估它是如何工作的,等等。
-
我不确定这是否会顺利进行。坦率地说,它可能被认为是一个糟糕的或仅链接的答案。我的理解是社区正在寻找包含代码的详细答案,而我的不符合该描述,这就是我将其发布为评论的原因。如果您对 Fine Uploader 有任何疑问,请查看 SO 上的 Fine-uploader 标签,我们会在其中处理库的支持问题。
-
@RayNicholus 我一直在研究使用 AWS 的“浏览器直接到 s3”上传,现在已经到了这个线程。我尝试过的两种方法是
getSignedUrl(),它非常简单,而这种形式的 POST 方法要复杂得多,但可配置性更高。我浏览了您的库,发现它使用了 s3 REST API,对吗?这和 Cognito 有什么关系吗?
标签: javascript node.js amazon-web-services amazon-s3 cryptography