S3直接在JavaScript上传

时间:2014-11-10 20:20:00

标签: javascript amazon-web-services amazon-s3 secret-key

我正在努力完成简单,并直接上传到Amazon S3。我如何以及在哪里隐藏我的访问权限和密钥呢?我没有在他们的文档或本网站上看到任何回答此问题的内容。

我正在使用他们推荐的方式在HTML中设置它。我也在使用Backbone和Bower。

<script src="https://sdk.amazonaws.com/js/aws-sdk-2.0.25.min.js"></script>
<script type="text/javascript">
  // See the Configuring section to configure credentials in the SDK
  AWS.config.credentials = ...;

  // Configure your region
  AWS.config.region = 'us-west-2';
</script>
<input type="file" id="file-chooser" /> 
<button id="upload-button">Upload to S3</button>
<div id="results"></div>

<script type="text/javascript">
  var bucket = new AWS.S3({params: {Bucket: 'myBucket'}});

  var fileChooser = document.getElementById('file-chooser');
  var button = document.getElementById('upload-button');
  var results = document.getElementById('results');
  button.addEventListener('click', function() {
    var file = fileChooser.files[0];
    if (file) {
      results.innerHTML = '';

      var params = {Key: file.name, ContentType: file.type, Body: file};
      bucket.putObject(params, function (err, data) {
        results.innerHTML = err ? 'ERROR!' : 'UPLOADED.';
      });
    } else {
      results.innerHTML = 'Nothing to upload.';
    }
  }, false);
</script>

2 个答案:

答案 0 :(得分:1)

您可以使用STS为每次上传生成短期临时凭证,并将其传递给JS SDK,这样您就不必透露您的长期API密钥。

使用AWS PHP SDK(编写器包:"aws/aws-sdk-php":"~2.4")的示例假设您的access_key_idsecret_access_key在ENV中可用。

邋example的例子:

<?php 
include 'vendor/autoload.php';

use Aws\Sts\StsClient;

/** Create Temporary Credentials */
$stsclient = StsClient::factory();
$temp_creds = $stsclient->getSessionToken(900)->get('Credentials'); // 15 minute expiration

?>
<script>
AWS.config.credentials = {
    accessKeyId : '<?php echo $temp_creds['AccessKeyId']; ?>',
    secretAccessKey : '<?php echo $temp_creds['SecretAccessKey']; ?>',
    sessionToken : '<?php echo $temp_creds['SessionToken']; ?>'
};
AWS.config.region = 'your-region';
</script>

这样您就无需透露自己的访问权限access_key_idsecret_access_key。在设定的时间间隔后,STS生成的密钥将无效。请务必遵循最佳实践,例如为长期存储的凭据创建有限角色的IAM用户。

参考:http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.Sts.StsClient.html#_getSessionToken

答案 1 :(得分:0)

您无法在javascript中隐藏您的凭据,因为所有代码都会发送到客户端,因此可见。你可以做很多事情来解决这个问题:

  • 如果您的应用程序的用户受到信任和身份验证,您可以选择仅通过检查文件顶部的PHP之类的cookie以及正确设置服务器以允许此操作来将脚本提供给经过身份验证的用户。 / LI>
  • 或者,如果您的脚本用户不受信任,我建议您直接向服务器发送请求,而不是S3。然后,您的服务器可以作为代理进行身份验证和处理文件传输,而不会将密钥公开显示。