AWS Подпись из нескольких частей. DoSNotMatch - PullRequest
1 голос
/ 06 апреля 2020

Я пытаюсь загрузить файл PDF в AWS S3 с использованием нескольких загрузок. Однако, когда я отправляю запрос PUT для загрузки детали, я получаю ошибку SignatureDoesNotMatch.

SignatureDoesNotMatch Рассчитанная нами подпись запроса не соответствует предоставленной вами подписи. Проверьте свой ключ и метод подписи.

Код моего сервера (узел) указан ниже:

CREATE MultiPart Upload

const AWS = require('aws-sdk');

AWS.config.region = 'us-east-1';
const s3 = new AWS.S3({ apiVersion: '2006-03-01' });

const s3Params = {
      Bucket: 'bucket-name',
      Key: 'upload-location/filename.pdf',
    }

const createRequest = await s3.createMultipartUpload({
          ...s3Params
          ContentType: 'application/pdf'
        }).promise(); 

GET Signed URL

let getSignedUrlParams = {
      Bucket: 'bucket-name',
      Key: 'upload-location/filename.pdf',
      PartNumber: 1,
      UploadId: 'uploadId',
      Expires: 10 * 60
    }

const signedUrl = await s3.getSignedUrl('uploadPart',getSignedUrlParams);

А код клиента (в JS):

const response = await axios.put(signedUrl, chunkedFile, {headers: {'Content-Type':'application-pdf'}});

Несколько замечаний:

  1. Этот код работает, когда я разрешить всем publi c доступ к корзине. Однако, если все publi c доступ заблокирован, код не работает.
  2. Когда все publi c доступ заблокирован, я все еще могу загрузить в корзину с теми же учетными данными, используя aws cli.
  3. Я уже пытался сгенерировать AWS Идентификатор ключа доступа и Секретный ключ доступа, но это не помогло.

Не в состоянии понять, в чем проблема. Любая помощь будет оценена.

PS: Это первый вопрос, который я разместил здесь. Поэтому, пожалуйста, прости меня, если я не разместил это должным образом. Дайте мне знать, если потребуется более подробная информация.

Ответы [ 3 ]

0 голосов
/ 06 апреля 2020

Для меня работала версия подписи. При инициализации S3 также следует упомянуть версию подписи.

const s3 = new AWS.S3({ apiVersion: '2006-03-01', signatureVersion: 'v4' });
0 голосов
/ 08 апреля 2020

Удалите заголовок Content-Part из вызова axios.

const response = await axios.put(signedUrl, chunkedFile);

При добавлении только части вы фактически не загружаете полный файл, поэтому тип содержимого не application-pdf в вашем case.

Это отличается от выполнения PUT для полного объекта.

0 голосов
/ 06 апреля 2020

Попробуйте что-то вроде этого, у меня это сработало.

var fileName = 'your.pdf';
var filePath = './' + fileName;
var fileKey = fileName;
var buffer = fs.readFileSync('./' + filePath);
// S3 Upload options
var bucket = 'loctest';

// Upload
var startTime = new Date();
var partNum = 0;
var partSize = 1024 * 1024 * 5; // Minimum 5MB per chunk (except the last part) http://docs.aws.amazon.com/AmazonS3/latest/API/mpUploadComplete.html
var numPartsLeft = Math.ceil(buffer.length / partSize);
var maxUploadTries = 3;
var multiPartParams = {
    Bucket: bucket,
    Key: fileKey,
    ContentType: 'application/pdf'
};
var multipartMap = {
    Parts: []
};

function completeMultipartUpload(s3, doneParams) {
  s3.completeMultipartUpload(doneParams, function(err, data) {
    if (err) {
      console.log("An error occurred while completing the multipart upload");
      console.log(err);
    } else {
      var delta = (new Date() - startTime) / 1000;
      console.log('Completed upload in', delta, 'seconds');
      console.log('Final upload data:', data);
    }
  });
}

В случае неудачной загрузки вы получите ошибку. Мы можем помочь вам решить эту проблему, если вы напечатаете результаты

console.log(this.httpResponse)

и

console.log(this.request.httpRequest)
...