Доступ запрещен при выполнении putObject для S3 в Dropzone.js с подписанным URL-адресом, созданным в Node.js - PullRequest
0 голосов
/ 22 января 2019

Я использую aws-sdk для Node для вызова getSignedUrl (), чтобы позволить пользователю на моем сайте загрузить файл непосредственно в S3.Контейнер настроен как частный с конфигурацией CORS, как показано ниже.

У меня есть пользователь IAM, с политикой пользователя ниже.Я использую ключ доступа и секрет для этого пользователя для создания подписанного URL.Я знаю, что у пользователя есть необходимый доступ к объектам PUT и GET, поскольку я успешно протестировал оба действия с помощью интерфейса командной строки AWS со своего компьютера.

Я протестировал возвращенный подписанный URL-адрес, используя мой код дропзоны вбраузер, использующий запрос cURL и непосредственно от POSTMAN, и во всех трех я получаю ответ 403 и ошибку «отказано в доступе», как показано ниже.Я указал заголовок «Content-Type» в каждом PUT для подписанного URL.Никаких других заголовков я не добавил явно.Предварительный запрос в браузере возвращает статус 200.

Я также протестировал предоставление пользователю IAM S3FullAccess и добавление подстановочного знака в AllowedOrigin в моей конфигурации CORS.Никаких кубиков ни с одним из них.

Я думаю, что это сужает это до способа, которым я создал подпись.Я пробовал различные комбинации параметров ниже, в течение нескольких дней, но безуспешно.

КОД ПОДПИСАНИЯ

const S3Client = require('aws-sdk/clients/s3');

const s3 = new S3Client({
  region: 'eu-west-2',
  accessKeyId: process.env.IAM_ACCESS_KEY,
  secretAccessKey: process.env.IAM_SECRET_ACCESS_KEY,
  signatureVersion: 'v4'
});

const getSignedUploadUrl = function(req, res, next) {

  const urlParams = {
    Bucket: process.env.S3_BUCKETNAME,
    Key: req.body.filename,
    Expires: 60 * 60 * 2,
    ContentType: req.body.contenttype
  };
  s3.getSignedUrl('putObject', urlParams, function(err, signedURL) {
    if(err){
      console.log(err);
    } else {
      res.status(200).json({
        url: signedURL
      });
    }
  });
};

ОШИБКА

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
  <Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>*****</RequestId>
    <HostId>*****</HostId>
  </Error>

CORS CONFIG

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

ПОЛИТИКА ПОЛЬЗОВАТЕЛЯ IAM

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketPolicy",
                "s3:GetBucketCORS"
            ],
            "Resource": "arn:aws:s3:::my-bucket"
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        }
    ]
}
...