Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AWS服务器端临时凭据是否可用于客户端S3上载?_Javascript_Node.js_Amazon Web Services_Amazon S3_Aws Sdk - Fatal编程技术网

Javascript AWS服务器端临时凭据是否可用于客户端S3上载?

Javascript AWS服务器端临时凭据是否可用于客户端S3上载?,javascript,node.js,amazon-web-services,amazon-s3,aws-sdk,Javascript,Node.js,Amazon Web Services,Amazon S3,Aws Sdk,使用v2.2.29的客户端版本(例如Bower),这是可能的(尽管显然不可接受,因为它向客户端公开了真实的aws凭据): 我们的梦想是将流程分为两部分,一部分是安全的服务器端,另一部分是以下客户端 第一部分。使用(例如)的Nodejs服务器端版本执行以下操作: var creds = new AWS.TemporaryCredentials(accessKeyId, secretAccessKey); creds.get(function() { var aws = { acce

使用v2.2.29的客户端版本(例如Bower),这是可能的(尽管显然不可接受,因为它向客户端公开了真实的aws凭据):

我们的梦想是将流程分为两部分,一部分是安全的服务器端,另一部分是以下客户端

第一部分。使用(例如)的Nodejs服务器端版本执行以下操作:

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
  });
}
第二部分。使用客户端版本的(例如Bower)执行以下操作:

似乎S3SDK可能受到限制,而且即使在理论上这样的事务是可能的,也不可能进行多部分上传


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

对于您的特定问题,您应该查看这些凭据的角色/策略,并确保允许多部分上载

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

我使用FineUploader来实现这一点(用于上传),他们提供了一系列示例,可以让您了解如何做到这一点(即使您不想使用FineUploader):

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
  });
}

Heruku还有一个例子:


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

请澄清“任何人都可以很容易地从您的服务器获取凭据”。。在最后一个示例中(不是第一个不安全的示例),凭据是服务器端的,对吗?我只想将临时凭据发送到客户端。我还没有尝试过,但我不认为在请求临时凭据时提供IAM角色将导致提供临时密钥+机密(ala Cognito,但没有用户生成)我的错误。我对javascript API没有太多经验,也没有意识到临时凭据是用于使用AWS STS的。因此,是的,您做的是正确的。我将更新或删除我的答案。您的问题可能与与临时凭据关联的IAM角色有关。
// 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();
});
<Code>SignatureDoesNotMatch</Code>
<Message>
    The request signature we calculated does not match the 
    signature you provided. Check your key and signing method.
</Message>