Загрузить файл на s3 через предопределенный URL 403 ошибка - PullRequest
0 голосов
/ 18 декабря 2018

У меня следующий лямбда-код для подписи:

var AWS = require('aws-sdk')
var s3 = new AWS.S3()

var bucketName = 'xxxx'

const {
  withStatusCode
} = require('../../utils/response.util')

const ok = withStatusCode(200, JSON.stringify)

const busboy = require('busboy')

const parseForm = (body, headers) => new Promise((resolve, reject) => {
  const contentType = headers['Content-Type'] || headers['content-type']
  const bb = new busboy({
    headers: {
      'content-type': contentType
    }
  })

  var data = {}

  bb.on('field', (fieldname, val) => {
    data[fieldname] = val
  }).on('finish', () => {
    resolve(data)
  }).on('error', err => {
    reject(err)
  })

  bb.end(body)
})


exports.handler = (event, context, callback) => {
  parseForm(event.body, event.headers).then((data) => {
    if (!data.contentType) {
      callback(new Error(`Missing contentType`))
    }

    if (!data.filePath) {
      callback(new Error(`Missing filePath`))
    }
    const key = data.filePath
    const params = {
      Bucket: bucketName,
      Expires: 3600,
      Key: key,
      Conditions: [
        // This depicts the ACL the file will have when uploaded
        { 'acl': 'public-read-write' },
        { 'success_action_status': '201' },
        ['starts-with', '$Content-Type', ''],
        ['starts-with', '$key', ''],
      ],
    }


    s3.createPresignedPost(params, (err, res) => {
      if (err) {
        callback(err)
      } else {
        callback(null, ok({
          signature: {
            'Content-Type': data.contentType,
            'acl': 'public-read-write',
            'success_action_status': '201',
            'Key': key,
            ...res.fields, // Additional fields submitted as headers to S3
          },
          postEndpoint: res.url,
        }))
      }
    })
  }, (error) => {
    callback(error)
  })
}

И он правильно возвращает данные знака в dropzone.И затем dropzone отправляет его в мое хранилище s3, но возвращает ошибку «Отказано в доступе 403.»

Здесь показан экран с данными, которые передаются в s3 через vue-dropzone https://github.com/rowanwins/vue-dropzone.

data submitted

Политика S3

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::jktuploads/*"
        }
    ]
}

Что плохого в подписании или отправке, которые не прошли успешно?Я попытался удалить все условия раздела, но это не имеет значения

...