2015-03-31 6 views
6

Ich versuche Bilder in Eimern auf Google Cloud Storage die JSON API mit hochladen, die Javascript Probe mit: Api Javascript SampleGoogle Cloud Storage Javascript Usage

Ich bin in der Lage Bilder hochladen, aber es fragt mich meine einzuloggen auf Google Benutzerkonto.

Das Beispiel enthält eine Autorisierungsschaltfläche, von der ich weiß, dass sie die OAuth-Anmeldeinformationen verwaltet.

function checkAuth() { 
    gapi.auth.authorize({ 
    client_id: clientId, 
    scope: scopes, 
    immediate: true 
    }, handleAuthResult); 
} 

Das Problem ist:

ich, ohne die Popup-Fenster authentifizieren will, das heißt ohne Login mit Google. Da mein Kunde die E-Mail-Adresse oder das Passwort nicht kennt, möchte ich, dass sie automatisch erfolgt.

Wie kann ich das erreichen?

Danke!

----------------------------- UPDATE ---------------- ----

folgende So Brandon Antwort i folgendes getan:

ich mein politisches Dokument erstellt haben und unterzeichnet es wie folgt aus:

var http = require('http'); 
var fs = require('fs'); 
var crypto = require('crypto'); 
var express = require('express'); 
var app = express(); 
var p12ToPem = require("./node_modules/p12-to-pem/p12ToPem.js"); 
var p12File = fs.readFileSync("./KEY.p12"); 
var pemKey = p12ToPem(p12File, "notasecret"); 
var policyJson={"expiration": "2050-06-16T11:11:11Z", 
"conditions": [["starts-with", "$key", "" ], 
{"acl": "bucket-owner-read" }, 
{"bucket": "my-bucket'name"}, 
{"success_action_redirect":"http://www.example.com/success_notification.html" }, 
["eq", "$Content-Type", "image/jpeg" ], 
["content-length-range", 0, 1000000] 
] 
}; 
var policyJson64 = new Buffer(''+policyJson).toString('base64'); 
var sign = crypto.createSign('RSA-SHA256'); 
sign.update(policyJson64); 
var sig = sign.sign(pemKey, 'base64') 
console.log("policyJson64:"+policyJson64); 
console.log("sig:"+sig); 

und meine Post Form ist die folgende:

<form action="http://my-bucket-name.storage.googleapis.com" method="post" enctype="multipart/form-data"> 
<input type="text" name="key" value=""> 
<input type="hidden" name="bucket" value="my-bucket-name"> 
<input type="hidden" name="Content-Type" value="image/jpeg"> 
<input type="hidden" name="GoogleAccessId" value="[email protected]account.com"> 
<input type="hidden" name="acl" value="bucket-owner-read"> 
<input type="hidden" name="success_action_redirect" value="http://www.example.com/success_notification.html"> 
<input type="hidden" name="policy" value="DONT KNOW WHAT TO PUT HERE"> 
<input type="hidden" name="signature" value="NEITHER HERE"> 
<input name="file" type="file"> 
<input type="submit" value="Upload"> 

Unabhängig von den Kombinationen, die in der Javascrypt erhalten werden, kann ich nicht herausfinden, was in die Politik und was in die Unterschrift geht, und JA! Ich habe die API gelesen, aber es ist nicht klar, was in diesen 2 Eingaben geht. Ich habe versucht, die Politikeingabe den Wert von PolicyJson64 und von sig ebenso zu setzen. Und ich habe versucht, den Signatureingang den Wert von sig und pemKey zu verwenden.

ich diesen Fehler:

<Error> 
<Code>SignatureDoesNotMatch</Code> 
<Message> 
The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method. 
</Message> 
<StringToSign> 
a/vDHoeJ1jIZibjgLnS/ZfMftmyz8IaISJiVt1b2wDNbDjnSR+0HyEDW9/Lew7ufMjU9xdtX/Uld06IJbeYz3OWGHnH4osJNS614RoDVd7lq2qft+bSCqYPtkagJiUWs9SNOPvuQzISthqloPQOwJ1LLXHYmV52c73OpexAnSR4= 
</StringToSign> 
</Error> 

Was soll ich sagen?

------ ------ UPDATE

Bitte nicht kopieren Paste Dokumentation, die nicht hilft. Bounty Hinzugefügt

Antwort

-3

Da Google Cloud Storage keine einfache Möglichkeit bietet, ein Bild hochzuladen (2014), habe ich am Ende Amazon Web Services verwendet, die sogar mit einem NodeJS-Beispielcode ausgeliefert werden. Einfach und einfach zu bedienen.

http://aws.amazon.com/es/developers/getting-started/nodejs/

Clone die Probe:

git clone https://github.com/awslabs/aws-nodejs-sample.git 

Install:

npm install 

Run:

node sample.js 

Die Probe wird mit Eimer Verwendung und sie ev Speichern Sie eine Datei im Bucket. Das wird es also schaffen. Stellen Sie sicher, Ihre Anmeldeinformationen zu ändern:

aws_access_key_id = YOUR_ACCESS_KEY_ID 
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY 

Prost!

+0

könnte es einen Weg mit Google geben; aber es ist sicher komplizierter – Ben

0

Das Hochladen eines Objekts erfordert eine Form der Autorisierung (Sie könnten auch einen Bucket erstellen, der wirklich anonyme Schreibvorgänge zulässt, aber das ist selten eine gute Idee). Es gibt einige Möglichkeiten, eine Autorisierung zu erhalten.

Ein Weg, wie Sie gefunden haben, besteht darin, dass sich ein Nutzer in seinem Google-Konto anmeldet und diesen als Autorisierung verwendet. Das ist eine gute Option, wenn die App für eine kleine Anzahl bekannter Personen ist.

Eine andere Möglichkeit zum Hochladen von Bildern besteht in der Verwendung von signierten URL- oder signierten Formularrichtliniendokumenten. Dadurch können Ihre Nutzer ein Standard-HTML-Formular verwenden, um ein Bild auszuwählen und hochzuladen, das von Ihrer App vorautorisiert wurde. Das Richtliniendokument ist ein kleiner Textabschnitt, der beschreibt, was der Benutzer tun darf und der von den entsprechenden Anmeldeinformationen signiert wurde.

Hier ist ein Beispiel eines politischen Dokuments:

{"expiration": "2010-06-16T11:11:11Z", 
"conditions": [ 
    ["starts-with", "$key", "" ], 
    {"acl": "bucket-owner-read" }, 
    {"bucket": "travel-maps"}, 
    {"success_action_redirect": "http://www.example.com/success_notification.html" }, 
    ["eq", "$Content-Type", "image/jpeg" ], 
    ["content-length-range", 0, 1000000] 
    ] 
} 

Dieses Dokument legt fest, dass Benutzer nur sie verwenden können für Uploads auf den heißen Stein „Reise-Karten-Objekte mit dem eimerinhaber lesen ACL, nur zum Hochladen ", kann nur Objekte mit einer Größe von bis zu 1 Megabyte hochladen, und so weiter. Der Server würde dieses Dokument dann unter Verwendung seines geheimen Schlüssels signieren. Das Dokument (in der Basis 64) und seine Unterschrift würde dann im HTML-Formular enthalten sein, etwa so:

<form action="http://travel-maps.storage.googleapis.com" method="post" enctype="multipart/form-data"> 
    <input type="text" name="key" value=""> 
    <input type="hidden" name="bucket" value="travel-maps"> 
    <input type="hidden" name="Content-Type" value="image/jpeg"> 
    <input type="hidden" name="GoogleAccessId" value="[email protected]"> 
    <input type="hidden" name="acl" value="bucket-owner-read"> 
    <input type="hidden" name="success_action_redirect" value="http://www.example.com/success_notification.html"> 
    <input type="hidden" name="policy" value="eyJleHBpcmF0aW9uIjogIjIwMTAtMDYtMTZUMTE6MTE6MTFaIiwNCiAiY29uZGl0aW9ucyI6IFsNCiAgWyJzdGFydHMtd2l0aCIsICJrZXkiLCAiIiBdLA0KICB7ImFjbCI6ICJidWNrZXQtb3duZXItcmVhZCIgfSwNCiAgeyJidWNrZXQiOiAidHJhdmVsLW1hcHMifSwNCiAgeyJzdWNjZXNzX2FjdGlvbl9yZWRpcmVjdCI6ICJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3N1Y2Nlc3Nfbm90aWZpY2F0aW9uLmh0bWwiIH0sDQogIFsiZXEiLCAiQ29udGVudC1UeXBlIiwgImltYWdlL2pwZWciIF0sDQogIFsiY29udGVudC1sZW5ndGgtcmFuZ2UiLCAwLCAxMDAwMDAwXQ0KICBdDQp9"> 
    <input type="hidden" name="signature" value="BSAMPLEaASAMPLE6SAMPLE+SAMPPLEqSAMPLEPSAMPLE+SAMPLEgSAMPLEzCPlgWREeF7oPGowkeKk7J4WApzkzxERdOQmAdrvshKSzUHg8Jqp1lw9tbiJfE2ExdOOIoJVmGLoDeAGnfzCd4fTsWcLbal9sFpqXsQI8IQi1493mw="> 
    <input name="file" type="file"> 
    <input type="submit" value="Upload"> 
</form> 

Es gibt viel mehr Dokumentation, wie das funktioniert hier:

https://cloud.google.com/storage/docs/reference-methods#policydocument

Halt Beachten Sie, dass sich eine signierte URL von einem signierten Formular unterscheidet. "Signierte URLs" sind sehr spezifische, willkürliche Befehle, die genau wie angegeben ausgeführt werden können. Sie könnten sie für Uploads verwenden, aber sie sind weniger vielseitig als signierte Richtliniendokumente.

+0

Wie haben Sie diesen Schritt ausgeführt: Melden Sie Ihr Richtliniendokument mithilfe von RSA mit SHA-256 unter Verwendung des in der Google Developers Console bereitgestellten geheimen Schlüssels an. ???? Welche Bibliotheken haben Sie verwendet, ich verwende JavaScrypt. @Brandon Yarbrough –

+0

kann nicht den Weg finden, es in JavaScrypt zu tun –

+0

Sind Ihre HTML/Javascript-Dateien statisch gehostet, oder haben Sie eine Web-Server-Komponente in einer Sprache ausgeführt? –