谷歌云存储的Javascript使用

问题描述:

我试图上传图片到使用JSON API在谷歌云端存储分区,使用JavaScript样本: Api Javascript Sample谷歌云存储的Javascript使用

我可以上传图片,但它要求我登录我的谷歌帐户。

样本有一个授权按钮,我理解它管理着OAuth凭证。

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

的问题是:

我想不必弹出界面进行身份验证,如果没有登录,就意味着在与谷歌。由于我的客户不知道电子邮件或密码,我希望它自动。

我该如何做到这一点?

谢谢!

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

所以以下布兰登的答案我也做了以下内容:

我创建了我的政策文件,并像这样签了字:

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

而且我的帖子形式如下:

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

无论在javascrypt中获得的组合,我似乎都无法弄清楚进入策略和进入签名的是什么,YES!我已经阅读了API,但是不清楚这两个输入是怎么回事。 我曾尝试将policyJson64和sig的值输入策略输入。而且我也尝试过在签名输入上输入sig和pemKey的值。

我得到这个错误:

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

我应该把?

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

请不要复制粘贴不起作用的文档。 赏金加入

随着谷歌云存储可是没有一个简单的方法来上传的图像(2014),我结束了使用它甚至还带有一个样品的NodeJS代码亚马逊网络服务。简单易用。

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

克隆样本:

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

安装:

npm install 

运行:

node sample.js 

样品自带水桶的使用和他们EV将文件存储在存储桶中。这样就可以做到。请务必更改凭据:

aws_access_key_id = YOUR_ACCESS_KEY_ID 
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY 

干杯!

+0

有可能是与谷歌的方式;但它肯定更复杂 – Ben 2016-09-22 07:02:19

上传对象需要某种形式的授权(您也可以创建一个允许真正的匿名写入的存储桶,但这很少是个好主意)。有几种方法可以获得授权。

您发现的一种方法是让用户登录其Google帐户并将其用作授权。如果该应用适用于少数已知个人,那么这是一个不错的选择。

上传图片的另一种方式是使用签名的URL或签名的表单策略文档。这可让您的用户使用标准的HTML表单来选择并上传已由您的应用预授权的图片。政策文件是一小段文字,描述了用户被允许执行的内容,并且已经由相应的凭证签名。

这里有一个政策文件的例子:

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

该文件规定用户只能用它来与斗所有者读取ACL上传物件,仅上传到桶“旅行地图“,只能上传大小为1兆字节的对象,等等。然后服务器将使用他们的密钥签署这份文件。该文件(在基地64)和其签名将被包含在HTML表单,像这样:

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

有很多关于如何在这里工作的多个文档:

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

保持请记住签名的URL与签名的表单不同。 “签名的URL”是非常具体的,任意的命令,可以完全按照规定执行。您可以使用它们进行上传,但与已签署的政策文件相比,它们的功能更少。

+0

你是怎么能做到这一步: 登录使用的谷歌开发者控制台提供给您的密钥使用RSA与SHA-256的政策文件。 ???? 你使用什么库,即时通讯使用JavaScrypt。 @Brandon亚伯勒 – 2015-03-31 09:11:55

+0

找不到做到在JavaScrypt – 2015-03-31 19:08:20

+0

的方式是你的HTML/JavaScript文件静态托管,或者你有一个Web服务器组件在一些语言运行? – 2015-03-31 19:56:22