AWS S3 - Настройка доступа к сайту - PullRequest
0 голосов
/ 22 мая 2018

Я следовал этому руководству: https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/s3-example-photo-album.html#s3-example-photo-album-scenario-prerequisites

Это в конечном итоге будет изменено для управления аудиофайлами, а не изображениями.

Я следовал руководству, но долженчто-то пропустил, так как я все еще получаю ошибку «Отказано в доступе» при попытке создания списка объектов.

Я создал корзину на S3 - это не общедоступная область - регион - это ЕС (Лондон), поэтому конфигурация eS-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?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Вы все делаете это правильно, все просто идеально.Теперь возникает концепция: вы создали общедоступный веб-сайт без сервера, на котором показаны некоторые изображения, которые любой публично может увидеть, используя временные учетные данные на стороне клиента, которые AWS Cognito предоставляет своему браузеру.Но вы не предоставили публичный доступ для чтения к нему, тогда как они будут к ним обращаться?

Вы должны создать ACL , то есть список контроля доступа, для объектов, которые вы хотите видетьpublic для public-read при загрузке объектов / изображений, чтобы каждый мог получить доступ только к тем объектам, которые разрешено делать только вам. Если вы хотите, чтобы public тоже загружал, то вы также должны предоставить доступ для записи.

Другое дело, что публичный доступ к корзине не означает, что у публики есть неограниченные полномочия для вашей учетной записи 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.';
        }

И если вы хотите более строгий контроль над своим сегментом, то вы можете использовать аутентифицированные пулы идентификации длясделайте это, а затем измените ваш код таким образом, чтобы конкретный пользователь мог получить доступ к определенным объектам в корзине s3 с именем пользователя в качестве префикса объектов, которые он / онаон загружает.

например,
yourbucketname / user1 / * доступно только для user1

неаутентифицированные пулы пользователей сами означают, что вы хотите, чтобы вседля доступа к конкретному ресурсу AWS с использованием временных учетных данных

0 голосов
/ 25 мая 2018

Я вижу проблему с вашей политикой S3 Bucket.Для вызова listObjects необходимо установить разрешение для корзины, а не для объектов в ней.

Короче говоря, вам нужно добавить "arn:aws:s3:::thisusesmybucketname" в оператор Resource, чтобы он выглядел следующим образом:

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:*"
        ],
        "Resource": [
            "arn:aws:s3:::thisusesmybucketname/*",
            "arn:aws:s3:::thisusesmybucketname"
        ]
    }
  ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...