web-dev-qa-db-fra.com

Amazon s3 Javascript - Aucun en-tête «Access-Control-Allow-Origin» n'est présent sur la ressource demandée

J'essaie de télécharger mon fichier via:

console.log("not broken til here");
    scope.inputMemeIsFile=true;
    var bucket = new AWS.S3({params: {Bucket: 'townhall.images'}});
    file = image.file;
    console.log(file);

    var params = {Key: file.name, ContentType: file.type, Body: file};
      bucket.upload(params, function (err, data) {
        var result = err ? 'ERROR!' : 'UPLOADED.';
        console.log(result);
        console.log(err);
      });

Cependant, j'obtiens l'erreur suivante:

XMLHttpRequest cannot load https://s3.amazonaws.com/<BUCKETNAME>/favicon.jpg. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:5000' is therefore not allowed access.

avec la procédureError: Network Failure {message: "Network Failure", code: "NetworkingError", time: Tue Feb 17 2015 13:37:06 GMT-0500 (EST), region: "us-east-1", hostname: "s3.amazonaws.com"…}

Ma configuration CORS ressemble à ceci et j'ai essayé quelques trucs sans succès.

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://*</AllowedOrigin>
        <AllowedOrigin>https://*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

Quelqu'un a une idée de ce qui ne va pas? J'ai consulté 5-6 messages similaires, mais personne ne semble pouvoir résoudre le problème.

24
John

Afin de télécharger des fichiers via un navigateur, vous devez vous assurer que vous avez configuré CORS pour votre compartiment Amazon S3 et exposé l'en-tête "ETag" via la déclaration ETag.

Je vous suggère de commencer avec une configuration de test ouverte, puis de la modifier selon vos besoins:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>DELETE</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
    <ExposeHeader>ETag</ExposeHeader>
  </CORSRule>
</CORSConfiguration>

Vérifiez ensuite vos autorisations de compartiment et votre configuration AWS (accessKeyId, secretAccessKey et region) car aucune de celles-ci n'est présente dans votre extrait de code.

Pour les tests, accédez à votre console de gestion IAM et créez un nouvel utilisateur IAM nommé prefix-townhall-test puis créez un groupe avec cette stratégie simple qui accorde l'accès à un compartiment:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::test-bucket-name"]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObject",
        "s3:DeleteObject"
      ],
      "Resource": ["arn:aws:s3:::test-bucket-name/*"]
    }
  ]
}

Assurez-vous que l'utilisateur que vous avez créé utilise le nouveau groupe avec cette stratégie.

Créez maintenant un script de test simple comme celui utilisé sur Amazon:

HTML

<input id="file-chooser" type="file" />
<button id="upload-button">Upload</button>
<p id="results"></p>

CODE (sur DOM prêt)

// update credentials
var credentials = {accessKeyId: 'new accessKeyId', secretAccessKey: 'new secretAccessKey'};
AWS.config.update(credentials);
AWS.config.region = 'us-west-1';

// create bucket instance
var bucket = new AWS.S3({params: {Bucket: 'test-bucket-name'}});

var fileChooser = document.getElementById('file-chooser');
var button = document.getElementById('upload-button');
var results = document.getElementById('results');
button.addEventListener('click', function() {
    var file = fileChooser.files[0];
    if (file) {
        results.innerHTML = '';

        var params = {Key: file.name, ContentType: file.type, Body: file};
        bucket.upload(params, function (err, data) {
            results.innerHTML = err ? 'ERROR!' : 'UPLOADED.';
        });
    } else {
        results.innerHTML = 'Nothing to upload.';
    }
}, false);
40
jungy

Certains navigateurs, tels que Chrome, ne prennent pas en charge localhost ou 127.0.0.1 pour les demandes CORS.

Essayez d'utiliser à la place: http://lvh.me:5000/

Voir https://stackoverflow.com/a/10892392/1464716 pour en savoir plus.

8
Edu Lomeli

Essayez <AllowedOrigin>*</AllowedOrigin>, sans protocole.

Si cela n'a aucun effet - vous avez probablement un problème côté client.

2
ermouth

Avez-vous essayé de spécifier votre origine au lieu d'utiliser un caractère générique. Je suis presque sûr que nous avons eu des problèmes similaires par le passé.

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://127.0.0.1:5000</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>
1
Jimmy Bernljung