2014-11-07 13 views
12

Con il seguente codice sono in grado di caricare il mio bucket pubblicamente scrivibile in Google Cloud Storage. (tutti gli utenti hanno il permesso di scrittura). Tuttavia se il bucket non è pubblicamente scrivibile, ricevo un errore 401 non autorizzato. (Non voglio che il bucket sia pubblicamente scrivibile).caricare su URL di archiviazione google cloud firmato con javascript

var file = $scope.myFile; 
     var fileData = file; 
     var boundary = '-------314159265358979323846'; 
     var delimiter = "\r\n--" + boundary + "\r\n"; 
     var close_delim = "\r\n--" + boundary + "--"; 

     var reader = new FileReader(); 
     reader.readAsBinaryString(fileData); 
     reader.onload = function(e) { 
     var contentType = fileData.type || 'application/octet-stream'; 
     var metadata = { 
      'name': 'objectName', //'lol' + fileData.name, 
      'mimeType': contentType 
     }; 

     var base64Data = btoa(reader.result); 
     var multipartRequestBody = 
      delimiter + 
      'Content-Type: application/json\r\n\r\n' + 
      JSON.stringify(metadata) + 
      delimiter + 
      'Content-Type: ' + contentType + '\r\n' + 
      'Content-Transfer-Encoding: base64\r\n' + 
      '\r\n' + 
      base64Data + 
      close_delim; 
     var stuff = angular.fromJson('{"Expires": "1415344534", "GoogleAccessId": "[email protected]account.com", "Signature": "AMkhO7mt2zg+s1Dzx28yQIMSrZlDC2Xx1SzvMCAgUVyiLXs5890/nA6PKzoc1KYBcRv/ALmkNaEVhvWHxE0EfcE151c0PYSG9x7AeSpQI/3dB1UPcSqpwilS1e2sgwB9piLNvBEXLNRXiLYyTiH22zkFZHAEQonJ3J25a47fwo4="}'); 
     var Expires = stuff.Expires; 
     var GoogleAccessId = stuff.GoogleAccessId; 
     var Signature = encodeURIComponent(stuff.Signature); 
     var BUCKET = 'mybucket'; 
     var request = $window.gapi.client.request({ 
      'path': '/upload/storage/v1/b/' + BUCKET + '/o', 
      'method': 'POST', 
      'params': { 
      'uploadType': 'multipart', 
      'Expires': Expires, 
      'GoogleAccessId': GoogleAccessId, 
      'Signature': Signature 
      }, 
      'headers': { 
      'Content-Type': 'multipart/mixed; boundary="' + boundary + '"' 
      }, 
      'body': multipartRequestBody}); 

     request.execute(function(r) { 
      console.log(r); 
     }) 
     } 

È possibile utilizzare URL registrati con il client gapi javascript? O non capisce i parametri.

In caso contrario: esistono esempi di CORS con l'API JSON da javascript per il caricamento con URL firmati?

(lascia supporre che la mia scadenza, GoogleAccessId & Firma siano corrette & partita quello che sto facendo in JavaScript & i permessi Ho installato sul secchio)

Fondamentalmente ci sono esempi di caricamento su archiviazione su cloud di google da client javascript da localhost senza richiedere all'utente di avere un account google & senza utilizzare un bucket pubblicamente scrivibile ma utilizzando gli URL firmati dispensati?

+0

Ciao Robert, ho cercato la stessa cosa. Sei riuscito a farlo alla fine? – Alex

+0

Penso di aver mollato e provato qualcos'altro e poi ho scoperto che il mio URL firmato era sbagliato da sempre, quindi probabilmente avrebbe funzionato se avessi firmato correttamente il mio url. Puoi usare gcutil per creare un url corretto e provarlo. –

+0

L'ho generato con gsutil, ma non puoi usarlo con/upload/storage/v1, devi inviare una richiesta PUT che non è riuscita a causa delle politiche CORP, quindi ho rinunciato e ho reso pubblico il bucket per adesso. – Alex

risposta

0

Utilizzare https://storage.googleapis.com come host per comporre l'URL che punta alla risorsa desiderata. Puoi scegliere tra alcuni modi per costruire il tuo URL di base. Here sono alcune combinazioni possibili.

Per riferimento, è anche possibile controllare a very simple snippet Python che potrebbe essere utile.

Spero che aiuti.

0

Stavo implementando lo stesso problema. Il problema è con SignedURL. Dopo aver corretto la firma, il caricamento ha funzionato come un incantesimo.

Come stavo usando php. Di seguito è riportato il codice per la generazione di URL firmati.

private function createSignedUrl($objectName, $bucketName, $key, $serviceEmailAddress, $method = 'GET', $duration = 600) 
{ 
    $expires = time() + $duration; 

// Line breaks are important! 
$toSign = (
    $method . "\n" . 
    /* Content-MD5 */ "\n" . 
    /* Content Type */ "\n" . 
    $expires . "\n" . 
    $objectName 
); 
$signature = urlencode(base64_encode(JWT::encode($toSign, $key, 'HS256'))); 
return array(
    'expires' => $expires, 
    'accessid' => $serviceEmailAddress, 
    'signature' => $signature, 
); 
} 
+0

E 'ancora funzionante? L'ho fatto funzionare nella versione 1.0 ma dopo l'aggiornamento alla versione 2.0 e provare a eseguire la migrazione non funziona più. In pratica sto esattamente come sopra – Tallkotten

Problemi correlati