【问题标题】:Are AWS server-side TemporaryCredentials usable for client-side S3 upload?AWS 服务器端 TemporaryCredentials 是否可用于客户端 S3 上传?
【发布时间】:2016-01-19 10:42:04
【问题描述】:

使用 AWS JavaScript SDK v2.2.29 的客户端版本(例如 Bower aws-sdk-js)这是可能的(尽管显然不可接受,因为它会将真实的 aws 凭据暴露给客户端):

var region = 'us-east-1',
    accessKeyId = 'AZ12341234',
    secretAccessKey = 'aBCde1FGhij2KLMnOPqr3TUvwx4YZ';

var creds = new AWS.Credentials(accessKeyId, secretAccessKey);

creds.get(function() {
  s3Location = new AWS.S3({
    region: my.region,
    credentials: creds
  });
  ready(); // which presents the upload form, binds events, etc..
});

梦想是将流程分成两部分,一个是安全的服务器端,另一个是客户端。

第 1 部分。使用 Nodejs 服务器端版本的 AWS JavaScript SDK(例如 aws-sdk)来执行此操作:

var creds = new AWS.TemporaryCredentials(accessKeyId,  secretAccessKey);

creds.get(function() {
  var aws = {
    accessKeyId: creds.accessKeyId,
    sessionToken: creds.sessionToken,
    region: my.region,
  };
  // e.g. makes aws var available to client
  res.render('form', {
    aws: aws
  });
}

第 2 部分。使用客户端版本的 AWS JavaScript SDK(例如 Bower aws-sdk-js)来执行类似的操作:

// e.g. aws = <from-server-side>
var creds = new AWS.Credentials(aws.accessKeyId, null, aws.sessionToken);
creds.get(function() {
  s3Location = new AWS.S3({
    credentials: creds,
    region: aws.region
  });
  ready();
});

上面的代码似乎可以工作,直到实际的分块上传开始,导致 403:

<Code>SignatureDoesNotMatch</Code>
<Message>
    The request signature we calculated does not match the 
    signature you provided. Check your key and signing method.
</Message>   

似乎 S3 SDK 可能会受到限制,即使这样的交易在理论上是可行的,也无法进行分段上传。

这可能吗?有什么想法吗?

【问题讨论】:

    标签: javascript node.js amazon-web-services amazon-s3 aws-sdk


    【解决方案1】:

    对于您的具体问题,您应该查看这些凭据的角色/策略,并确保您允许分段上传。

    另一种解决方案是客户端请求服务器返回一个签名 URL,允许客户端直接获取/发布文件到 S3(不使用 AWS API,而是直接使用 HTTP。

    我使用 FineUploader 来做到这一点(用于上传),他们有一堆示例可以让您了解如何执行此操作(即使您不想使用 FineUploader):

    http://docs.fineuploader.com/branch/master/endpoint_handlers/amazon-s3.html

    Heruku 也有一个例子:https://devcenter.heroku.com/articles/s3-upload-node

    但是您正在做的事情(或使用 Cognito 做类似的事情)应该可以工作。因此,问题必须与与您正在创建的临时凭证关联的角色/策略有关。

    【讨论】:

    • 请澄清“任何人都可以轻松地从您的服务器获取凭据”。在最后一个示例(不是不安全的第一个示例)中,凭据是服务器端的,对吗?我只想将 TemporaryCredentials 发送给客户端。我还没有尝试过,但我并不认为在请求临时 Credentails 时提供 IAM 角色会导致提供临时密钥+秘密(ala Cognito,但没有用户生成)
    • 我的错误。我对 javascript API 没有太多经验,也没有意识到 TemporaryCredentials 是用于使用 AWS STS。所以,是的,你在做正确的事。我将更新或删除我的答案。您的问题可能与与临时凭证关联的 IAM 角色有关。
    猜你喜欢
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多