当前位置: 首页 > 面试题库 >

Amazon S3 POST api,并使用NodeJS签名策略

司空赞
2023-03-14
问题内容

我正在尝试构建一个允许用户从支持NodeJS的网站直接将文件上传到我的Amazon S3存储桶的版本。看来,除了
实际的亚马逊文档
以外,这里仅有的所有教程都已经过时了。

我一直在关注的基本信息,但是它又过时了。它没有要crypto纠正的方法调用,因为它试图将原始JavaScript对象传递给该update方法,因为它不是字符串或缓冲区,所以会引发错误。

我也一直在寻找 knoxnpm软件包的源代码。它没有内置的POST支持-我完全理解,因为一旦它具有正确的字段,它就是由浏览器执行POST。Knox似乎具有签署策略的正确代码,并且我已尝试根据此代码使我的代码正常工作……但同样无济于事。

这是我想出的代码。它产生一个以base64编码的策略,并创建一个签名…但是当我尝试上传文件时,根据Amazon的说法,这是错误的签名。

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);
};

我显然在这里做错了。但是我不知道该怎么办。任何人都可以帮助您确定我在做什么错吗?我的问题在哪里? 是否有人有有效的教程来说明如何从NodeJSv0.10.x生成带有签名的正确的Amazon S3策略,并进行签名,以将其发布到s3 REST api?


问题答案:

好吧,我终于想通了。在玩了很长时间的随机猜谜游戏之后,我心想

“也许我需要签署base64编码策略”-我

BAM 就是这样。

我还重新排列了条件以匹配表单的发布方式,尽管我不确定这会有所不同。

var crypto = require("crypto");
var config = require("../../amazonConfig.json");

exports.createS3Policy = function(contentType, callback) {
  var date = new Date();

  var s3Policy = {
    "expiration": "2014-12-01T12:00:00.000Z", // hard coded for testing
    "conditions": [
      ["starts-with", "$key", "somefolder/"], 
      {"bucket": "my-bucket-name"}, 
      {"acl": "public-read"}, 
      ["starts-with", "$Content-Type", contentType],
      {"success_action_redirect": "http://example.com/uploadsuccess"},
    ]
  };

  // stringify and encode the policy
  var stringPolicy = JSON.stringify(s3Policy);
  var base64Policy = Buffer(stringPolicy, "utf-8").toString("base64");

  // sign the base64 encoded policy
  var signature = crypto.createHmac("sha1", config.secretKey)
    .update(new Buffer(base64Policy, "utf-8")).digest("base64");

  // build the results object
  var s3Credentials = {
    s3Policy: base64Policy,
    s3Signature: signature
  };

  // send it back
  callback(s3Credentials);
};

希望这会帮助遇到相同问题的其他人。



 类似资料:
  • 我正在尝试将支付网关集成到我的nodejs应用程序中。当支付完成时,网关用支付结果将用户重定向到我的站点。结果是RSA签名的,我需要用支付网关提供的公钥来验证它。 下面是支付网关为签名验证提供的示例PHP代码。 有谁知道怎么把这件事搞定吗?

  • 我需要实现一个jax-ws客户机。 以下是提供商文档对安全性的看法 目前,我们在http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0.pdf 本标准使用了W3C规范中的另外两个标准: XMLENC(http://www.w3.org/TR/2002/REC-xmlenc-core-2002

  • 我正在尝试为Google云存储中的私人存储文件创建签名;这样我就可以分发一个限时链接。 现在这样做,它的签名太短了...我哪里错了?

  • 我想做的是: 使用证书使用openssl对zip文件进行签名,并创建签名文件(PKCS#7) 我安装了openssl并打开了控制台 我创建了一个rsa密钥(openssl genrsa-out key.pem 2048) 我创建了一个请求(openssl req-batch-sha256-new-key key.pem-out request.pem-subj'/c=../st=../l=../o

  • 下面是Java代码: 然后使用C代码来验证签名 我在想我需要将我的签名编码为hexa,但它并没有解决我的问题。我已经使用crypto编写了一个c版本的符号方法,并且已经验证过了。所以为什么当我使用java代码时,签名没有得到验证。谢谢

  • 我需要发布预签名URL,允许用户获取文件并将其放入特定的S3存储桶。我创建了一个IAM用户,并使用其密钥创建预签名URL,并在该用户中添加了一个嵌入的自定义策略(见下文)。当我使用生成的URL时,我的策略出现了一个AccessDenied错误。如果我向IAM用户添加FullS3Access策略,则可以使用相同的URL获取或放置文件,因此显然缺少我的自定义策略。它怎么了? 以下是我正在使用的不起作用