2

Wie kann ich die SignedURL verwenden, die von der Go-API mit CORS zurückgegeben wird?CORS mit SignedURL

CURRENT SETUP:

Bucket Config

gsutil cors get gs://example-bucket

kehrt:

[{ 
    "maxAgeSeconds": 1, 
    "method": ["GET", "HEAD", "PUT", "DELETE", "POST", "OPTIONS"], 
    "origin": ["http://example.com", "https://example.com", "http://localhost:4000"], 
    "responseHeader": ["Origin", "Accept", "X-Requested-With", "Authorization", "Content-Type", "Content-Length", "Accept-Encoding", "X-CSRF-Token" 
]}] 

Go-API-Aufruf

acc, _ := appengine.ServiceAccount(ctx) 

signedUrl, err := storage.SignedURL(
     "example-bucket", 
     fileName, 
     &storage.SignedURLOptions{ 
      GoogleAccessID: acc, 
      SignBytes: func(b []byte) ([]byte, error) { 
       _, signedBytes, signingError := appengine.SignBytes(ctx, b) 
       return signedBytes, signingError 
      }, 
      Method:  "PUT", 
      ContentType: contentType, 
      Expires:  time.Now().Add(1 * time.Hour), 
     }) 

JS XHR

Verwendet die SignedURL von Go, dh xhr.open("PUT", signedUrl);

EXTRA NOTES

Die SignedURL von der Go-API erzeugt wird, beginnt immer mit https://storage.googleapis.com/example-bucket/fileName ... anderswo Ich habe gelesen, dass es www.googleapis.com/storage sein sollte, aber ich denke nicht, dass dies das Problem ist, sicherlich ist die URL, die von der offiziellen API zurückgegeben wird, co richtig.

Ich kann sehen, dass die Request-Header enthalten:

  • access-control-request-headers: content-type,x-upload-content-type
  • access-control-request-method: PUT
  • origin: http://localhost:4000

So scheint es, es, alle Felder der erforderlichen Header ticks off ...

Antwort

3

Auf der JS-Seite wurde ich hinzufügen hinzufügen itive Metadaten für die Datei-Uploads über den Header X-Upload-Content-Type.

Da dieser Header nicht in der CORS-Konfiguration enthalten war, sind die Anforderungen fehlgeschlagen.

Durch diesen Header in die Konfiguration hinzufügen (zum Beispiel des responseHeader Liste gsutil cors set config-Datei im Lieferumfang enthalten), alles funktioniert genau wie in der Frage beschrieben :)