Получение объекта AWS S3 с использованием предварительно подписанного URL SignatureDoesNotMatch

Я создал ведро в регионе Ирландия и заблокировал к нему весь публичный доступ. Кроме того, я создал скрипт для создания предварительно подписанного URL-адреса для получения объекта. По какой-то причине я всегда получаю ошибку SignatureDoesNotMatch. Я не могу понять причину этого. ниже мой код:

let getPresignedUrl = async () => {
    const AWS = require('aws-sdk');
    const s3 = new AWS.S3({apiVersion: '2006-03-01', region: 'eu-west-1'});

    console.log(`Starting...`);

    const params = {Bucket: 'mybucket', Key: 'potato.jpeg', Expires: 300};
    const url = await s3.getSignedUrlPromise('getObject', params);
    console.log('The URL is', url); // expires in 60 
};

getPresignedUrl();

Это сообщение, которое я получаю

<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
<AWSAccessKeyId>key</AWSAccessKeyId>
<StringToSign>GET 1603525258 /mybucket/potato.jpeg</StringToSign>
</Error>

person Nicolas El Khoury    schedule 24.10.2020    source источник
comment
Проверьте AWS Config — › идентификатор ключа и значение ключа, содержат ли они пробелы/пробелы?   -  person Mahesh_Loya    schedule 24.10.2020
comment
Нет, они не. Я передаю их как переменные среды   -  person Nicolas El Khoury    schedule 24.10.2020
comment
попробуйте добавить свойство contentType в getSignedUrlPromise params. константные параметры = {Bucket: 'mybucket', Key: 'potato.jpeg', Expires: 300, ContentType: 'image/jpeg'};   -  person Shahar Yakov    schedule 25.10.2020


Ответы (1)


Попробуйте изменить это:

const s3 = new AWS.S3({apiVersion: '2006-03-01', region: 'eu-west-1'});

К этому:

const s3 = new AWS.S3({apiVersion: '2006-03-01', region: 'eu-west-1', signatureVersion: 'v4'});
person Marcox    schedule 01.02.2021