Javascript AWS服务器端临时凭据是否可用于客户端S3上载?
使用v2.2.29的客户端版本(例如Bower),这是可能的(尽管显然不可接受,因为它向客户端公开了真实的aws凭据): 我们的梦想是将流程分为两部分,一部分是安全的服务器端,另一部分是以下客户端 第一部分。使用(例如)的Nodejs服务器端版本执行以下操作: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
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>