【问题标题】:amazon s3 authorization header invalid亚马逊 s3 授权标头无效
【发布时间】:2015-03-22 07:26:25
【问题描述】:

我在使用 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));

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

【问题讨论】:

  • 我不清楚 this._getSignature(signature) 正在返回什么或您实际尝试使用哪个版本的 S3 授权 (V2/V4)(它看起来像(可能)V2,我不知道您为什么要这样做,因为只有 V4 在所有 S3 区域都有效)。

标签: node.js amazon-web-services amazon-s3


【解决方案1】:

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

http://aws.amazon.com/tools

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

【讨论】:

  • 但我正在为我们在 nodejs 中创建的框架创建 amazon s3 api。这不仅仅是让我现在的生活变得糟糕,而是让使用我们框架的开发人员的生活变得轻松。
  • @SébastienStormacq 你不应该自己编写代码......这是一个非常强烈的断言,我不同意。用户遇到的许多问题是因为他们的 SDK 是一个拐杖,可以保护他们不受服务实际操作和通信方式的影响。如果他们真的熟悉低级 REST 接口,他们要么会避免这些问题,要么不会对意外行为如此迷惑。我们中的一些人不喜欢“高水平”。我想与尽可能低级别的服务进行交流,并且正是出于这个原因,我编写了所有自己的 AWS 库。
  • 点了。但这场辩论与编程一样古老。您应该使用汇编语言还是使用“高级”C 编程语言进行编程:-)?当然,我承认它们是需要直接访问 REST API 的用例。而且我知道开发人员喜欢重新发明轮子,而不是重用别人开发的库:-)。但是对于绝大多数应用程序和开发人员来说,SDK 会让生活变得更简单。关于这个问题,在不了解上下文或要求的情况下 - 第一个建议是:使用 SDK"
  • 还有一个适用于 NodeJs 的 SDK,您可以将其嵌入到您的自定义框架中
  • 完全跑题了。您可能有成千上万的理由编写自己的代码。一个非常简单的原因是当您使用 AWS 未提供 SDK 的技术时。
猜你喜欢
  • 2010-10-20
  • 2016-01-13
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 2012-05-01
相关资源
最近更新 更多