2014-11-07 6 views
12

Mit dem folgenden Code kann ich in meinem öffentlich beschreibbaren Eimer in Google Cloud-Speicher hochladen. (allUsers hat Schreibberechtigung). Wenn der Bucket jedoch nicht öffentlich schreibbar ist, erhalte ich einen nicht autorisierten 401-Fehler. (Ich möchte nicht, dass der Eimer öffentlich beschreibbar ist).Upload in Google Cloud Speicher signierte URL mit 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); 
     }) 
     } 

Ist es möglich, signierte URLs mit dem Javascript-Client gapi zu verwenden? Oder versteht es die Params nicht?

Wenn nicht - gibt es Beispiele für CORS mit der JSON api von Javascript für den Upload mit signierten URLs tun?

(lässt vermuten, dass mein Ablauf, GoogleAccessId & Unterschrift korrekt & Spiel sind, was ich in der JavaScript-& die Berechtigungen mache ich auf den heißen Stein eingerichtet haben)

im Grunde sind es Beispiele für das Hochladen Google Cloud-Speicher von Javascript-Client von localhost, ohne dass der Benutzer ein Google-Konto & ohne Verwendung eines öffentlich beschreibbaren Eimer, aber mit Hilfe von verzichteten signierten URLs?

+0

Hallo Robert, ich habe nach der gleichen Sache gesucht. Hast du es am Ende geschafft? – Alex

+0

Ich glaube, ich habe aufgegeben und etwas anderes versucht und dann habe ich herausgefunden, dass meine signierte URL die ganze Zeit falsch war - also hätte es wahrscheinlich funktioniert, wenn ich meine URL korrekt signiert hätte. Sie können gcutil verwenden, um eine korrekte URL zu erstellen und das zu versuchen. –

+0

Ich habe es mit gsutil erzeugt, aber du kannst es nicht mit/upload/storage/v1 benutzen, du musst eine PUT-Anfrage senden, die wegen der CORP-Richtlinien fehlgeschlagen ist, also gab ich auf und machte den Bucket öffentlich jetzt. – Alex

Antwort

0

Verwenden Sie https://storage.googleapis.com als Host zum Verfassen der URL, die auf die gewünschte Ressource verweist. Sie können zwischen mehreren Möglichkeiten zum Erstellen Ihrer Basis-URL wählen. Here sind einige mögliche Kombinationen.

Als Referenz können Sie auch a very simple snippet Python, die hilfreich sein könnte.

Ich hoffe, es hilft.

0

Ich habe das gleiche Problem implementiert. Das Problem ist mit SignedURL. Nach dem Korrigieren des Signedurl funktionierte der Upload wie ein Zauber.

Da war ich mit PHP. Unten ist der Code zum Generieren von signierten URLs.

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

Funktioniert das noch? Ich hatte es in Version 1.0 funktioniert, aber nach dem Upgrade auf 2.0 und versuchen, es zu migrieren, funktioniert es nicht mehr. Ich mache im Grunde genau so wie oben – Tallkotten