Невозможно загрузить файл на S3 с Почтальоном, используя предварительно подписанный URL. Ошибка: SignatureDoesNotMatch - PullRequest
0 голосов
/ 06 января 2019

Как загрузить файл на S3 с подписанным URL-адресом?

Я попробовал следующее:

  const AWS = require('aws-sdk');
  const s3 = new AWS.S3({ accessKeyId: "", secretAccessKey: "" });

  const url = s3.getSignedUrl("putObject", {
    Bucket: "SomeBucketHere",
    Key: "SomeNameHere",
    ContentType: "binary/octet-stream",
    Expires: 600
  });

Но когда я пытаюсь загрузить Postman с помощью следующих шагов, я получаю ошибку SignatureDoesNotMatch.

  1. метод PUT с URL из приведенного выше кода
  2. Тело: binary (переключатель), выберите файл, выберите файл для загрузки
  3. Нажмите Отправить

Я могу подтвердить, что разрешения IAM здесь не являются проблемой. У меня есть полный доступ к ведру.

Что не так и как мне проверить мой подписанный URL?

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Не уверен, что это поможет, но я считаю, что вам нужно передать версию подписи.

В Python у вас есть что-то вроде:

import boto3 as boto3
from botocore.client import Config

...

s3_client = boto3.client('s3', config=Config(signature_version='s3v4'))
url = s3_client.generate_presigned_url(
            ClientMethod='put_object',
            Params={
                'Bucket': bucket,
                'Key': key,
            },
            ExpiresIn=60
        )
print url

Таким образом, эквивалент в Javascript будет:

var AWS = require('aws-sdk');
var s3 = new AWS.S3({
  signatureVersion: 'v4',
});


exports.handler = (event, context, callback) => {
  const url = s3.getSignedUrl('putObject', {
    Bucket: '**\[YOUR-S3-BUCKET\]**',
    Key: 'mykey',
    Expires: 10,
  });


  callback(null, url);
};

Источники:

Срок действия предварительно назначенного URL-адреса для корзины S3 истекает раньше указанного времени истечения

Использование предварительно подписанных URL-адресов для загрузки файла в личное хранилище S3

0 голосов
/ 06 января 2019

Эта проблема когда-то вызывала у меня много боли.

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

Заголовок: Content-Type = binary/octet-stream

Как только я изменил это, файл успешно загружен.

Надеюсь, это спасет кого-то от неприятностей в будущем.

...