2017-02-15 10 views
1

За последние 3 дня я застрял в том же выпуске подписи. Я не понимаю, как выйти из этого.Ошибка: Подписанная нами подпись запроса не соответствует подписи, которую вы предоставили. Проверьте свой ключ и метод подписи

Я пытаюсь получить предварительно подписанный URL с этим:

s3.getSignedUrl('putObject', 
    event.pre_signed_url =  
      {Bucket:config.awsBucket,Key:event.filename} 
    ); in Node js. 

И это предварительно подписали URL я использую, чтобы загрузить файл изображения в s3 ведре с помощью:

request({ 
     method:'PUT', 
     url: event.pre_signed_url, 
     ContentType: 'image/png', 
     body: fs.createReadStream('./image.png')} 
     , function(err, res, body) 
    { if(err)console.log(err); return callback(body); } 
); 

И файл успешно загружается в ведро s3, и я могу видеть его в консоли aws s3.

Проблема в том, что предварительно подписанный URL-адрес, который я получаю, если я пытаюсь использовать любой другой файл изображения, используя curl с терминала или пытающийся открыть URL-адрес в браузере, он дает мне ошибку с неправильной совпадением.

Прошу вас, если я ошибаюсь, или мое понимание с использованием заранее подписанного использования URL неверно.

+0

Решено: Я был на самом деле делает запрос GET к URL вернулся из s3.getSignedUrl («putObject»), но для просмотра sceenshot в s3 ведро после загрузки я должен проверить назначенный url из s3.getSignedUrl ('getObject') для просмотра скриншота – learner

+0

Это была моя проблема. Если вы хотите опубликовать это как ответ, я с радостью продолжу. – Gary99

ответ

0

Я столкнулся с той же проблемой при использовании S3.getSignedUrl('putObject', serveride, а затем попытался использовать этот URL-адрес клиента. Вы устанавливаете дополнительный заголовок для запроса, который не задан в параметрах.

Что я заметил в своем случае, что может иметь отношение к вашему, заключается в том, что подписи, созданные со всеми S3.getSignedUrl, учитывают заголовки запросов. Поэтому, если вы создаете URL-адрес, он будет работать с тем же сообщением об ошибке, которое вы получили, если не отправлено с теми же заголовками.

Одним из примеров отказа: Сформирован как это ..

var params = { Bucket: 'YourBucket', Key: 'uniqueFileKey', Expires: 10000 }; 
s3.getSignedUrl('putObject', params, function (err, url) { 
     if(err){ 
     return cb(err); 
     } 
     return cb(null, url) 
    }); 

Следующая запрос не при использовании тот же URL генерируется. Этот запрос был сделан из браузера.

RequestMethod: Put 
Headers: { 
    Accept:*/* 
    Accept-Encoding:gzip, deflate, br 
    Accept-Language:en-US,en;q=0.9 
    Connection:keep-alive 
    Content-Length:11768 
    Content-Type:application/x-www-form-urlencoded; charset=UTF-8 
} 

А разница в том, что подпись выше создана не включает в себя тип содержимого, если запрос имеет указать тип содержания. Парамам необходимо сопоставить заголовки, или ошибка, которую выбрала, будет не подписи.

Успешный пример ниже:

var params = { Bucket: 'YourBucket', Key: 'uniqueFileKey', Expires: 10000, Content-Type: 'application/x-www-form-urlencoded; charset=UTF-8' }; 
s3.getSignedUrl('putObject', params, function (err, url) { 
     if(err){ 
     return cb(err); 
     } 
     return cb(null, url) 
    });