Impossible de télécharger l’image avec s3 getSignedUrl (‘getObject ..) et retourne Signature ne correspond pas

Je suis relativement nouveau sur AWS. Tout ce que j’essayais de faire est de télécharger l’image de mon application sur un aws S3 et de la télécharger pour afficher l’image sur une autre page de l’application. Le téléchargement a réussi et a pu voir l’image téléchargée en S3. Mais ne peut pas le télécharger car il génère l’erreur suivante.

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"; } 

Voici le code suivant pour télécharger l’image qui fonctionne bien côté serveur

  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; .... } } 

Voici le code suivant utilisé pour télécharger l’image à l’aide de getSignedUrl pour s3 à partir du serveur

 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); }) 

Une fois que j’ai renvoyé le fullUrl au côté client qui est l’application, j’ai essayé d’utiliser les éléments suivants

 $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; }); }); 

Du côté de l’application, lorsque j’ai essayé de télécharger l’image, je reçois le message mentionné ci-dessus. J’ai essayé d’append l’algorithme client de cryptage côté serveur nx-amz: AES256 comme en-tête. J’ai besoin de savoir ce qui suit

  1. Est-ce la bonne méthode pour transmettre les données du serveur au client (application)?
  2. Si l’urlParams pour l’URL getSigned est correcte. Je ne sais pas si je manque quelque chose ou quelque chose à faire.

Quelqu’un peut-il me conseiller dans la bonne direction.

Eh bien, j’ai résolu mon auto. Mais merci pour votre aide, Michael et les autres. La solution est que j’ai ajouté la ligne suivante comme options dans l’un des

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

qui a résolu le problème. On dirait que encodeUI est défini sur true par défaut, ce qui a modifié la signature.

Pour autant que je sache, la fonction getSignedUrl ne vérifie pas que le fichier existe,

1-Assurez-vous que votre URL de fichier est correcte (pas d’URL signée).

2-Assurez-vous que la permission et l’access à votre seau sont corrects

Enfin, vérifiez la date et l’heure de votre ordinateur lorsque vous appelez la fonction getSignedUrl.