AWS错误的时差

问题描述 投票:0回答:1

我正在使用异步调用来调用aws而且我得到了这个。 <![CDATA["Signature expired: 20171114T190104Z is now earlier than 20180323T213705Z (20180323T214205Z - 5 min.)"]]>

我知道这很可能是因为我的机器关闭了时钟,但我该如何解决呢?时间设置为自动确定。 enter image description here

我正在使用Fedora。

This回答提示AWS密钥可能超时(?)(我不完全理解这个)。如果是这样,我该如何解决这个问题?我按照错误的建议尝试手动更换我的时钟-5分钟和+ 5分钟,但它没有做任何事情。

编辑:使用live heroku服务器时出现相同的错误。

Edit2:我正在使用Node Express并进行如下调用:

function(callback) {
  // third call
  var results = '';
  var options = {
    host: urlObject.host,
    protocol: urlObject.protocol,
    path: urlObject.path,
    headers: {
      Authorization: `AWS4-HMAC-SHA256 Credential=key/20171114/us-west-1/awis/aws4_request, SignedHeaders=host;x-amz-date, Signature=key`,
      'Content-Type': 'application/xml',
      'X-Amz-Date': '20171114T190104Z',
      Accept: 'application/xml',
    },
  };
  https.get(options, resource => {
    resource.setEncoding('utf8');
    resource.on('data', function(data) {
      // results += JSON.parse(data);
      results += data;
    });
    resource.on('end', function() {
      callback(null, results);
    });
    resource.on('error', function(err) {
      callback(err);
    });
  });
},
javascript node.js amazon-web-services
1个回答
2
投票

您需要使用X-Amz-Date标头提供当前日期,而不是示例代码中的日期。这个blog post有一个如何在Node.js中执行此操作以遵循AWS API期望的格式的示例:

// get the various date formats needed to form our request
var amzDate = getAmzDate(new Date().toISOString());

// this function converts the generic JS ISO8601 date format to the specific format the AWS API wants
function getAmzDate(dateStr) {
  var chars = [":","-"];
  for (var i=0;i<chars.length;i++) {
    while (dateStr.indexOf(chars[i]) != -1) {
      dateStr = dateStr.replace(chars[i],"");
    }
  }
  dateStr = dateStr.split(".")[0] + "Z";
  return dateStr;
}

然后,当然,您需要将amzDate变量分配给请求中的X-Amz-Date标头。

从长远来看,我认为你会发现使用官方Node.js AWS SDK而不是尝试将这些查询定制为AWS期望的格式更有用,所以你可能想要探索它!

© www.soinside.com 2019 - 2024. All rights reserved.