使用AWS SDK for JavaScript访问AWS S3

4

我目前正在使用javascript SDK访问我的s3存储桶,它可以正常工作,但是我直接在javascript中硬编码了所有凭据,但在SDK中他们说你可以将这些凭据存储在AWS.config对象中,而我不知道如何做到这一点。此外,在线资源也没有提供足够的信息,因此请问有人能告诉我如何做到这一点或者是否有其他更好的方法来代替硬编码凭据?

    <script type="text/javascript">
        AWS.config.accessKeyId = 'dddddddddd';
        AWS.config.secretAccessKey = 'rrrrrrrrrrrrrrrreeeeeeeeeeeeeeeeeeeee';
        AWS.config.region = 'us-east-1';

        // create the AWS.Request object
        var bucket = new AWS.S3({ params: { Bucket: 'some.bucket' } });
        bucket.listObjects(function (err, data) {
            if (err) {
                document.getElementById('status').innerHTML =
                  'Could not load objects from S3';
            } else {
                document.getElementById('status').innerHTML =
                  'Loaded ' + data.Contents.length + ' items from S3';
                for (var i = 0; i < data.Contents.length; i++) {
                    document.getElementById('objects').innerHTML +=
                      '<li>' + data.Contents[i].Key + '</li>';
                }
            }
        });
    </script>

对于那些仍在访问这个问题的人,accessKeyIdsecretAccessKey已经被弃用。我选择使用这种方法:https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials-json-file.html - Kevin Danikowski
3个回答

1
我认为更好的方法是将其存储在~/.aws/credentials中。您可以通过创建文件或使用cli命令aws configure,回答问题,它会生成此文件:
[default]
aws_access_key_id = THEACCESSKEYHERE
aws_secret_access_key = THESECRETACCESSKEYHERE

和 ~/.aws/config:

[default]
output = json (or whatever you prefer here)
region = us-east-1 (or whatever region you are using)

这样做不需要为每个命令或调用所需的AWS手动添加它。

你需要在JavaScript中放置什么代码才能从.aws/credentials文件中加载它们? - Dtor
@Dtor console.log(process.env.aws_secret_access_key) - f1lt3r

0

我相信浏览器不支持这个功能。AWS JavaScript SDK 在 node.js 上得到了全面的支持。

阅读:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS.html

这是有道理的,因为没有人会想在公共场合下暴露私有的身份验证/授权信息。

如果你想要弄得高端一些,你可以从另一个服务器使用 JSONP 传递凭据 (http://en.wikipedia.org/wiki/JSONP),并通过防火墙限制对某些客户端的访问,但这可能会变得有点混乱。


另外,为什么不公开暴露S3存储桶以供读取访问,因为浏览器上的JavaScript本来就是公开的呢?

AWS里面不是已经包含了很多公共的身份验证/授权信息吗?(可以看一下Cognito SDK的例子)。我的理解是,如果我错了请纠正,授权可以基于每个身份进行,会话密钥是为登录生成的,附加到IAM角色,并且该系统足够安全,因为这些密钥通过HTTPS传递,锁定到域并且有过期时间。此外,完美前向保密性也可以开启。所以identity-access-keys可以来自Identity Pool登录,而不必是实际的admin-access-keys到存储桶。明白了吗? - f1lt3r

0

有一种方法可以在浏览器中实现JS上传而不暴露您的私人凭据。但是,这需要一些服务器端逻辑。

请参见此处的答案:JavaScript中直接上传S3


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接