No se pudo descargar la imagen con s3 getSignedUrl (‘getObject ..) y devuelve La firma no coincide

Soy relativamente nuevo en AWS. Todo lo que estaba tratando de hacer es subir la imagen de mi aplicación a aws S3 y descargarla para ver la imagen en otra página de la aplicación. La carga se realizó correctamente y pudo ver la imagen cargada en S3. Pero no pudo descargarlo ya que arroja el siguiente error.

FileTransferError {body = "\nSignatureDoesNotMatchThe request signature we calculated does not match the signature you provided. Check your key and signing method.AKXXXXXXXXXXXXXXXXXX GET\n\n\n1469897687\n/huntuploads/uploads/%25222a85a6675d15eeeca5c8b da6eed4c52e%2522 cUBhtiA5AGJbj8vl%2FX6xi%2B9BBRY%3D 47 45 54 0a 0a 0a 31 34 36 39 38 39 37 36 38 37 0a 2f 68 75 6e 74 66 6f 6f 64 75 70 6c 6f 61 64 73 2f 75 70 6c 6f 61 64 73 2f 25 32 35 32 32 32 61 38 35 61 36 36 37 35 64 31 35 65 65 65 63 61 35 63 38 62 64 61 36 65 65 64 34 63 35 32 65 25 32 35 32 32 CCB513320456EB6B v4c7Ozf911tErWo5dCsL9RNLL78r3rUE6234Z801ZFXuELrji4juDehHmaxnK8t5qMBGcjz90a I="; code = 3; "http_status" = 403; source = "https://huntuploads.s3-us-west- 2.amazonaws.com/uploads/%25222a85a6675d15eeeca5c8bda6eed4c52e%2522? AWSAccessKeyId=AKXXXXXXXXXXXXXXXXXX&Expires=1469897687&Signature=cUBhtiA5AGJbj8vl% 252FX6xi%252B9BBRY%253D"; target = "file:///var/mobile/Containers/Data/Application/1EB46B25-8BC5- 46C9-BE6B-BF1E120B7627/Documents/%222a85a6675d15eeeca5c8bda6eed4c52e%22"; } 

Aquí está el siguiente código para cargar la imagen que funciona bien en el lado del servidor

  var AWS = require('aws-sdk'); AWS.config.update({accessKeyId: 'AXXXXXXXXX......', secretAccessKey: 'XXXXX....'}); AWS.config.update({region: 'us-west-2'}); var s3 = new AWS.S3( { params: {Bucket: 'huntfooduploads'}}); app.post('/FileUpload', function(req, res, next) { var fileStream = fs.createReadStream(req.files.file.path); var params = { 'Key': 'uploads/' + req.files.file.name, 'Body': fileStream, 'ContentEncoding': 'base64', 'Content-Type ': 'image/jpeg' }; s3.upload(params, function(err, data) { if (err) throw err; console.log('after s3 upload====', err, data); var imgFileInfo = req.files; var imgUploadData = data; .... } } 

Este es el siguiente código utilizado para descargar la imagen usando getSignedUrl para s3 desde el lado del servidor

 var urlParams = {Bucket: 'huntuploads', Key:'uploads/'+rows[0].MyHunt_FileName}; // s3 getSigned Url s3.getSignedUrl('getObject', urlParams, function(err, url) { if (err) throw callback(err); var fullUrl={awsUrl:url}; res.send(fullUrl); }) 

Una vez que envié el fullUrl de vuelta al lado del cliente que es la aplicación, intenté usar lo siguiente

 $cordovaFileTransfer.download(encodeURI(itemData[3].awsUrl), targetPath, options, trustHosts) .then(function(result) { console.log('Success! Download is successful'); $scope.imgURI = targetPath; }, function(err) { console.log('Error!!! Download is not successful'); // Error }, function (progress) { $timeout(function () { $scope.downloadProgress = (progress.loaded / progress.total) * 100; }); }); 

Desde el lado de la aplicación, cuando intenté descargar la imagen, recibí el mensaje mencionado anteriormente. Intenté agregar nx-amz-server-side-encryption-customer-algor: AES256 como encabezado. Necesito saber lo siguiente

  1. ¿Es este el método correcto de pasar los datos del servidor al cliente (aplicación)?
  2. Si el urlParams para obtener url firmado es correcto. No estoy seguro si me falta algo o algo por hacer.

Alguien me puede aconsejar en la dirección correcta.

Bueno, he resuelto mi auto. Pero gracias por tu ayuda Michael y otros. La solución es agregar la siguiente línea como opciones en uno de los

var options = {encodeURI: false}; y luego cordovaFileTransfer.download (encodeURI (itemData [3] .awsUrl), targetPath, options, trustHosts) {…}

que solucionó el problema. Parece que encodeUI se establece en verdadero de forma predeterminada, lo que cambió la firma.

Por lo que sé, la función getSignedUrl no comprueba la existencia del archivo,

1-Asegúrese de que la URL de su archivo sea correcta (no la URL firmada).

2-Asegúrate de que el permiso y el acceso a tu cubo sean correctos

Finalmente, verifique la fecha y hora de su máquina cuando llame a la función getSignedUrl.