2015-03-31 72 views
6

sto provando a caricare le immagini in secchi su Google Cloud Storage utilizzando il JSON API, utilizzando il campione Javascript: Api Javascript SampleGoogle Cloud Storage JavaScript Uso

Sono in grado di caricare le immagini, ma mi chiede di fare il login sul mio account Google.

L'esempio ha un pulsante di autorizzazione, che a mio avviso gestisce le credenziali OAuth.

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

Il problema è:

voglio per autenticare senza avere il pop-up dello schermo, questo significa che senza effettuare il login con Google. Perché il mio cliente non conosce l'e-mail o la password, voglio che sia automaticamente.

Come posso ottenere questo risultato?

Grazie!

----------------------------- AGGIORNAMENTO ---------------- ----

Quindi seguendo la risposta di Brandon ho fatto la seguente:

ho creato il mio documento di politica e firmato in questo modo:

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); 

e la mia forma post è il seguente:

<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"> 

Non importa le combinazioni ottenute nella javascrypt, non riesco a capire cosa va in politica e cosa in firma, e SÌ! Ho letto l'API ma non è chiaro su cosa vada in questi 2 ingressi .. Ho provato a inserire nell'input della politica il valore di PolicyJson64 e anche di sig. E ho provato a mettere sull'ingresso della firma il valore di sig e pemKey.

ottengo questo errore:

<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> 

cosa devo mettere?

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

Si prega di non copia incolla documentazione non sta aiutando. Bounty Added

risposta

-3

Poiché Google Cloud Storage non dispone di un modo semplice per caricare un'immagine (2014), ho finito per utilizzare Amazon Web Services che viene fornito con un codice di esempio NodeJS. Facile e semplice da usare.

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

Clone campione:

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

Installare:

npm install 

Run:

node sample.js 

Il campione viene fornito con l'uso della benna e ev it archivia un file nel secchio. Così lo farà. Assicurati di cambiare le tue credenziali:

aws_access_key_id = YOUR_ACCESS_KEY_ID 
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY 

Cheers!

+0

potrebbe esserci un modo con google; ma è sicuramente più complicato – Ben

0

Il caricamento di un oggetto richiede una qualche forma di autorizzazione (è anche possibile creare un bucket che consenta scritture veramente anonime, ma raramente è una buona idea). Ci sono alcuni modi per acquisire l'autorizzazione.

Un modo, come hai trovato, è di avere un utente accedere al proprio account Google e utilizzarlo come autorizzazione. Questa è una buona opzione se l'app è per un piccolo numero di individui noti.

Un altro modo per caricare le immagini è utilizzare l'URL firmato o i documenti dei criteri firmati. Ciò consente ai tuoi utenti di utilizzare un modulo HTML standard per selezionare e caricare un'immagine che è stata pre-autorizzata dalla tua app. Il documento politico è un piccolo frammento di testo che descrive ciò che l'utente è autorizzato a fare ed è stato firmato dalle credenziali appropriate.

Ecco un esempio di un documento politico:

{"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] 
    ] 
} 

Questo documento specifica che gli utenti possono utilizzare solo per caricare oggetti con l'ACL secchio-proprietario-leggere, solo per arrivi al secchio "viaggio-maps ", può solo caricare oggetti fino a 1 megabyte di dimensioni e così via. Il server firmerebbe quindi questo documento usando la sua chiave segreta. Il documento (in base 64) e la sua firma sarebbe poi essere incluso nel modulo HTML, in questo modo:

<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> 

C'è molto di più documentazione su come funziona qui:

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

Tenere tenere presente che un URL firmato è diverso da un modulo firmato. Gli "URL firmati" sono comandi arbitrari molto specifici che possono essere eseguiti esattamente come indicato. Potresti usarli per i caricamenti, ma sono meno versatili dei documenti di polizze firmati.

+0

Come siete riusciti a fare questo passo: Iscriviti tuo documento politico utilizzando RSA con SHA-256 utilizzando la chiave segreta fornita a voi in Google Developers Console. ???? Quali librerie hai usato, im utilizzando JavaScrypt. @Brandon Yarbrough –

+0

non riesco a trovare il modo di farlo in JavaScrypt –

+0

I file HTML/Javascript sono ospitati staticamente o il componente di un server Web è in esecuzione in una lingua? –

Problemi correlati