Позвоните предварительно подписанному URL S3 с почтальоном - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь использовать предварительно подписанный URL для загрузки, как описано в документации (https://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html) Я могу получить предварительно подписанный URL, но когда я пытаюсь сделать PUT в Почтальоне, я получаю следующееошибка:

<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>

Очевидно, что структурированный мой вызов пут не совпадает с тем, как AWS вычисляет подпись. Я не могу найти много информации о том, что требует этот вызов пут.

Я попытался изменить заголовок для Content-Type на multipart / form-data и application / octet-stream. Я также попытался снять отметку с раздела заголовков в почтальоне и полагаться на тип тела для обоихнастройки данных формы и двоичных файлов, в которых я выбираю файл. Настройка данных формы приводит к следующему добавлению в вызов:

Content-Disposition: form-data; name = "thefiletosend.txt"; filename ="thefiletosend.txt

Кроме того, я заметил, что почтальон включает в себя то, что он называет" временными заголовками ", следующим образом:

Хост: s3.amazonaws.com Тип контента: text / plain Пользователь-Agent: PostmanRuntime / 7.13.0 Принять: / Управление кэшем: без кэширования Почтальон-токен: e11d1ef0-8156-4ca7-9317-9f4d22daf6c5,2135bc0e-1285-4438-bb8e-b21d31dc36db Хост: s3.amazonaws.com accept-encoding: gzip, deflate content-length: 14 Соединение: keep-alive кэш-контроль: no-cache

Заголовок Content-Type может быть одной из проблем, но я неОпределенно, как исключить эти «временные заголовки» в почтальоне.

Я создаю предварительно подписанный URL-адрес в лямбде следующим образом:

    public string FunctionHandler(Input input, ILambdaContext context)
    { 
        _logger = context.Logger;
        _key = input.key;
        _bucketname = input.bucketname;

        string signedURL = _s3Client.GetPreSignedURL(new GetPreSignedUrlRequest()
        {
            Verb = HttpVerb.PUT ,
            Protocol = Protocol.HTTPS,
            BucketName = _bucketname,
            Key = _key,
            Expires = DateTime.Now.AddMinutes(5)
        });

        returnObj returnVal = new returnObj() { url = signedURL };

        return JsonConvert.SerializeObject(returnVal);

    }
...