0

J'essaie d'obtenir des fichiers via AJAX à partir du stockage google cloud sur mon hôte local. Je l'ai fait ce qui suit:Google Cloud Storage ignorant les en-têtes d'origine du contrôle d'accès

Réglez le CORS pour mon seau via gsutil:

gsutil cors set cors.json gs://my-project

où le fichier est cors.json:

[ 
    { 
    "origin": [ 
     "*" 
    ], 
    "responseHeader": ["Origin", "Accept", "X-Requested-With", "Authorization", "Content-Type",  "Content-Length", "Accept-Encoding", "X-CSRF-Token"], 
    "method": [ 
     "GET", 
     "OPTIONS" 
    ], 
    "maxAgeSeconds": 1 
    } 
] 

Je l'ai vérifié avec gsutil cors get gs://my-project

Ensuite, pour chaque fichier que j'ai rendu public, à la fois via la bibliothèque client node.js lorsque le fichier est téléchargé:

bucket.file(object.name).makePublic()

via la console, et à travers le gsutil:

gsutil -m acl set -R -a public-read gs://my-project

Puis dans ma demande ajax, je vous envoie aussi des en-têtes:

$.ajax({ 
      method: "GET", 
      url: "https://googleapis.com/storage/v1/b/my-project/o?delimiter=audio", 
      headers: { 
       'Access-Control-Allow-Origin': '*' 
      }, 
      crossDomain: true, 
     }).done((data) => { 
      console.log(data) 
     }) 

et je reçois encore erreur de cors:

Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://localhost:3000 ' is therefore not allowed access.

Comment puis-je passer CORS?

Répondre

1

Vous utilisez "googleapis.com" au lieu de "www.googleapis.com". Ajoutez le "www" et votre code fonctionnera. Il semble que vous n'effectuez aucune authentification. Vous devez donc également vous assurer que votre compartiment autorise les utilisateurs anonymes à répertorier les objets (gsutil acl ch -g allUsers:R gs://bucket-name le définira).

Ensuite, pour les demandes anonymes, il est recommandé d'ajouter un paramètre de clé API associant la requête à votre projet Google Cloud. GCS autorisera les demandes complètement anonymes, mais elles peuvent être bloquées si elles sont trop fréquentes.

Enfin, la politique CORS sur un compartiment n'est respectée que par l'API XML. L'API JSON, qui est celle avec le point de terminaison de "www.googleapis.com", répondra volontiers aux requêtes d'origine croisée sans avoir besoin de définir de propriétés spéciales dans le compartiment.

+0

Réponse très utile - merci! – mheavers

+0

Voici mon format de terminal: "storage.googleapis.com/[BUCKET_NAME]/[OBJECT_NAME]", est-ce que cela signifie que vous devez le remplacer par "www.storage.googleapis.com/[BUCKET_NAME]/[OBJECT_NAME]"? – KevinHu

+0

storage.googleapis.com/BUCKET/OBJECT va bien. –