Node.js amazon s3授权标头无效

Node.js amazon s3授权标头无效,node.js,amazon-web-services,amazon-s3,Node.js,Amazon Web Services,Amazon S3,我在amazon s3身份验证方面遇到问题 错误指向亚马逊授权。 上面说 AWS授权标头无效。预期的AwsAccessKeyId:签名 这是我的代码: // set default values for optional params first bucket = bucket || null; path = path || '/'; query = query || []; data = data || null; headers = header

我在amazon s3身份验证方面遇到问题

错误指向亚马逊授权。 上面说

AWS授权标头无效。预期的AwsAccessKeyId:签名

这是我的代码:

   // set default values for optional params first
    bucket = bucket || null;
    path = path || '/';
    query = query || [];
    data = data || null;
    headers = headers || [];
    amazon = amazon || null;

    //get host - bucket1.s3.amazonaws.com
    var host    = this._getHost(bucket);
    //get url - http://bucket1.s3.amazonaws.com/some/path
    var url     = this._getUrl(host, path, query);
    //get path - /bucket1/some/path
    var path    = this._getPath(bucket, path);

    hashed().ksort(amazon);

    // initiatialize variables needed
    var restHeaders = amazonHeaders = [];

    headers.Host = host;
    headers.Date = time().toDate(Date.now(), 'D, d M Y H:i:s T', true);

    for (var header in amazon) {
        restHeaders.push(header+': '+amazon[header]);
        amazonHeaders.push(header.toLowerCase()+':'+amazon[header]);
    }

    for (var header in headers) {
        restHeaders.push(header+': '+headers[header]);
    }

    amazonHeaders = '\n'+amazonHeaders.join('\n');

    if(!amazonHeaders.trim()) {
        amazonHeaders = null;
    }

    if(!(typeof headers['Content-MD5'] !== 'undefined')) {
        headers['Content-MD5'] = null;
    }

    if(!(typeof headers['Content-type'] !== 'undefined')) {
        headers['Content-Type'] = null;
    }

    //get signature
    var signature = [
        action,
        headers['Content-MD5'], 
        headers['Content-Type'],
        headers['Date']+amazonHeaders,
        path];

    signature = signature.join('\n');
    if(headers.Host == 'cloudfront.amazonaws.com') {
        signature = headers.Date;
    }

    restHeaders.push('Host: '+host);
    restHeaders.push('Date: '+headers.Date);
    restHeaders.push('Authorization: '+this._getSignature(signature));

请帮帮我,我永远都在坚持这一点。

对于大多数传统用例和应用程序,您不应该自己编写代码来计算签名。您的编程语言应该使用AWS提供的SDK


这些SDK提供更高级别的功能,更易于使用。它们管理许多低级细节,如连接管理、错误处理和。。。签名

但是我正在为我们正在创建的内置nodejs框架创建amazons3api。这不仅仅是让我的生活变得糟糕,而是让将使用我们框架light的开发人员的生活变得糟糕。@SébastienStormacq您不应该自己编写代码。。。这是一个非常有力的断言,我不同意。用户遇到的很多问题都是因为他们认为SDK是一根拐杖,它保护他们不受服务实际运行和通信方式的影响。如果他们真的熟悉低级REST接口,他们要么会避免这些问题,要么不会被意外的行为迷惑。我们中的一些人不喜欢“高级别”。我想以尽可能低的级别与服务交流,并且正是出于这个原因,我编写了自己的AWS库。我的观点是正确的。但这场辩论和编程一样古老。您应该用汇编语言还是用“高级”C语言编程:-)?一、 当然,要认识到它们是需要直接访问RESTAPI的用例。我知道开发人员喜欢重新发明轮子,而不是重用其他人开发的库:-)。但对于绝大多数应用程序和开发人员来说,SDK将使生活变得更简单。关于这个问题,在不了解任何上下文或需求的情况下,第一条建议是:使用SDK“还有一个用于NodeJ的SDK,您可以完全脱离主题将其嵌入自定义框架中。您可能有成千上万的理由编写自己的代码。一个非常简单的原因是,当您使用技术时,AWS不提供SDK。我不清楚这是什么。_getSignature(signature)正在返回,或者您实际尝试使用的是哪个版本的S3授权(V2/V4)(看起来像(可能)V2,我不确定您为什么要这样做,因为只有V4在所有S3区域中工作)。