AWS服务器端TemporaryCredentials是否可用于客户端S3上传?

时间:2016-01-16 01:59:05

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

使用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部分。使用AWS JavaScript SDK的Nodejs服务器端版本(例如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可能受到限制,即使理论上可以进行此类交易,也不可能进行分段上传。

应该可以吗?有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

另一种解决方案是客户端请求服务器返回一个签名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做类似的事情)应该有效。因此,问题必须与您正在创建的临时凭证相关联的角色/策略相关。