【问题标题】:AWS S3 - Configuring Website accessAWS S3 - 配置网站访问
【发布时间】:2018-11-01 07:14:36
【问题描述】:

我一直在关注这个教程:https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/s3-example-photo-album.html#s3-example-photo-album-scenario-prerequisites

这最终将被更改为管理音频文件而不是图像。

我已按照指南进行操作,但必须遗漏一些内容,因为我在尝试列出对象时仍然收到拒绝访问错误。

我在 S3 上创建了一个存储桶 - 它不是公共存储桶 - 地区是欧盟(伦敦)所以 eu-west-2 CORS 配置:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
  </CORSRule>
</CORSConfiguration>

访问控制列表仅显示具有列表、写入、读取存储桶和写入存储桶权限的帐户(一长串数字/字母)的访问权限。

在 Amazon Cognito 控制台中,我有一个身份池,虽然我相信我只会使用未经身份验证的身份,但身份池具有分配给未经身份验证和身份验证的角色?

未经身份验证的角色具有以下策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::thisusesmybucketname/*"
        ]
    }
  ]
}

然后在我的网站上做:

<script src="https://sdk.amazonaws.com/js/aws-sdk-2.243.1.min.js"></script>
<script type="text/javascript">

function getHtml(template) {
  return template.join('\n');
}

var albumBucketName = 'myactualname';
var IdentityPoolId = 'eu-west-2:lotsofcharacters';

AWS.config.update({
  region: 'eu-west-2',
  credentials: new AWS.CognitoIdentityCredentials({
    IdentityPoolId: IdentityPoolId,
  })
});

var s3 = new AWS.S3({
  apiVersion: '2006-03-01',
  params: {Bucket: albumBucketName},
});

listAlbums();

function listAlbums() {
  s3.listObjects({Delimiter: '/'}, function(err, data) {
    if (err) {
      console.log(err.message);
      //return alert('There was an error listing your albums: ' + err.message);
    } else {
      // we never get here
    }
  });
}
</script>

我在这里错过了什么吗?如果我回到存储桶并为读/写设置公共访问权限,那么一切正常 - 但是我理解这样做是错误的方法,因为它向使用我的 AWS 的任何人/每个人开放?

谢谢!

【问题讨论】:

    标签: amazon-web-services amazon-s3


    【解决方案1】:

    我发现您的 S3 存储桶策略存在问题。 listObjects 调用需要在存储桶上设置权限,而不是在其中的对象上。

    简而言之,你需要在你的 Resource 语句中添加"arn:aws:s3:::thisusesmybucketname",所以它看起来像这样:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::thisusesmybucketname/*",
                "arn:aws:s3:::thisusesmybucketname"
            ]
        }
      ]
    }
    

    【讨论】:

    • 就是这样 - 像往常一样,当别人指出它时似乎很容易。添加了这一点并将存储桶策略收紧为特定于Referer,现在似乎已经全部排序,谢谢!
    【解决方案2】:

    你们都做对了,一切都很完美。现在概念来了,您创建了一个无服务器公共网站,其中显示了一些公共图像,任何人都可以使用 AWS Cognito 提供给浏览器的客户端临时凭证看到这些图像。 但是你没有给它公开的读取权限,那么他们将如何访问它们呢?

    在上传对象/图像时,您必须为您希望公众看到的对象创建ACL,即访问控制列表以public-read,以便任何人只能访问那些只有您允许这样做的对象。如果您也想公开上传,那么您还必须提供写访问权限。

    另一件事是授予对存储桶的公开读取访问权限并不意味着公众对您的 AWS 账户拥有无限的权力,他们有意为他们提供了一个特定的位置,他们可以与您网站的存储服务进行交互。

    这是我这样做的代码:

    var file = fileChooser.files[0];
    if (file) {
        results.innerHTML = '';
    
    var params = {
                        Key: 'maus/group1.jpeg',
                        ContentType: file.type,
                        Body: file,
                        ACL: 'public-read'
                    };
    
                    s3.putObject(params, function (err, data) {
                        if (err) {
                            results.innerHTML = 'ERROR: ' + err;
                        }else {
                            results.innerHTML = ' snapshot uploaded !!!';
                        }
                    }).on('httpUploadProgress', function (progress) {console.log(progress);});
    } else {
    
                results.innerHTML = 'Nothing to upload.';
            }
    

    如果您想对存储桶进行更严格的控制,则可以使用 authenticated identity pools 来执行此操作,然后以特定用户可以访问 s3 中的特定对象的方式修改您的代码以用户名作为他/她上传的对象前缀的存储桶。

    例如
    yourbucketname/user1/*仅供用户1访问

    未经身份验证的用户池本身意味着您希望每个人都使用临时凭证访问特定的 AWS 资源

    【讨论】:

      猜你喜欢
      • 2020-01-06
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 2018-05-04
      • 2021-07-19
      相关资源
      最近更新 更多