繁体   English   中英

如何使用后端预签名URL使用其SDK将文件上传到Amazon S3?

[英]How can i use a backend pre-signed url to upload files to Amazon S3 using its SDK?

我有一个Rails后端,它返回给我一个“签名”字符串,“ objectKey”字符串和一个“策略”字符串。 我必须使用这些参数来上传用户选择的文件,但是我找不到任何使用这些参数的方法,而不是使用Amazon JavaScript SDK的“ accessKey”和“ accessSecretKey”。

我已经有一个进行上传的代码,但是它直接使用了凭据,而且看起来不安全。

有人已经遇到这个问题了吗?

您无法上传带有预签名网址的对象。 AWS提供了一种解决方案来授予称为AWS安全令牌服务的临时凭证。 简称为AWS STS。

请求临时安全凭证-AWS Identity and Access Management

举些例子:

  1. 用户访问您的Rails应用程序。
  2. 您的rails应用程序将使用AWS STS发行并返回临时凭证。

     client = Aws::STS::Client.new policy = AWS::STS::Policy.new do |p| p.allow( actions: ['s3:PutObject'], resources: ['arn:aws:s3:::some-bucket/path/to/xxx*'], effect: 'allow' ) end token = client.get_federation_token(name: 'name', policy: policy.to_json, duration_seconds: 900) puts token.credentials.to_json # { # "access_key_id": "XXXXXXXXXXXXXXXXXXXX", # "secret_access_key": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", # "session_token": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", # "expiration": "2016-03-25T00:46:20Z" # } 
  3. 用户使用临时凭据安全地上载对象。

请注意,使用临时凭证时,必须使用access_key_id,secret_access_key和session_token进行身份验证。

找不到适用于JavaScript的AWS Sdk的问题的解决方案。

看起来,在我们的例子中,工作流(签名/策略生成)与本文中显示的相同https://aws.amazon.com/articles/1434

为了解决此问题,我将Sdk替换为简单的XmlHttpRequest和FormData对象,以将文件推送到s3。 有效负载无法更改以保持与应用程序其他部分的兼容性。 使用这种方法,必须在formData中具有一个AccessKey,策略,签名,密钥(文件密钥)和文件。 根据策略/签名的生成方式,还需要向formData添加其他字段以使工作正常。 在这种情况下,我添加了一个sucess_action_status。

挂载formData的代码:

  var formData = new FormData();
  formData.append('key', <KEY>);
  formData.append('AWSAccessKeyId', <ACCESS_KEY>);
  formData.append('policy', <POLICY>);
  formData.append('signature', <SIGNATURE>);
  formData.append('success_action_status', <SUCCESS_CODE>);
  formData.append('file', file, file.name);

使用此表单数据,像这样创建XMLHttpRequest

var request = new XMLHttpRequest();
request.open("POST","https://<YOUR BUCKET>.s3.amazonaws.com");
request.setRequestHeader("enctype", "multipart/form-data");

并发送通过formData对象的请求。

request.send(formData);

重要的是要记住,formData中的值必须遵守生成的策略。

可以通过添加以下监听器来获得上传过程:

request.upload.addEventListener('progress', function(e){
      console.log(e);
});

谢谢大家的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM