Google 云存储 Javascript 使用情况
Google Cloud Storage Javascript Usage
我正在尝试使用 JSON API 将图像上传到 Google 云存储上的存储桶中,使用 Javascript 示例:
Api Javascript Sample
我可以上传图片,但它要求我登录我的 google 帐户。
示例有一个授权按钮,据我所知管理 OAuth 凭据。
function checkAuth() {
gapi.auth.authorize({
client_id: clientId,
scope: scopes,
immediate: true
}, handleAuthResult);
}
问题是:
我想在没有弹出屏幕的情况下进行身份验证,这意味着不使用 Google 登录。因为我的客户不知道电子邮件或密码,所以我希望它是自动的。
我怎样才能做到这一点?
谢谢!
----------------------------更新---------------- -----
所以根据 Brandon 的回答,我做了以下事情:
我已经创建了我的保单文件并像这样签名:
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);
我的 post 表格如下:
<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="884257827820-so77htet9tafrcjjp83m7api9lh12qsn@developer.gserviceaccount.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 中获得的组合如何,我似乎都无法弄清楚什么进入策略,什么进入签名,是的!我已经阅读了 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>
我应该放什么?
------更新------
请不要复制没有帮助的粘贴文档。
赏金增加
上传对象需要某种形式的授权(您也可以创建一个允许真正匿名写入的存储桶,但这很少是个好主意)。有几种方法可以获取授权。
如您所见,一种方法是让用户登录其 Google 帐户并将其用作授权。如果该应用程序适用于少数知名人士,那是一个不错的选择。
另一种上传图片的方法是使用签名的 URL 或签名形式的保单文件。这允许您的用户使用标准的 HTML 表单来 select 并上传已被您的应用预授权的图像。策略文档是一小段文本,描述了允许用户执行的操作并已由适当的凭据签名。
这是一个政策文件的例子:
{"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]
]
}
本文档指定用户只能使用它来上传具有 bucket-owner-read ACL 的对象,仅用于上传到存储桶 "travel-maps",最多只能上传 1 兆字节的对象,并且很快。然后服务器将使用他们的密钥签署该文档。文档(以 base 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="1234567890123@developer.gserviceaccount.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="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 不同于签名的表格。 "Signed URLs" 是非常具体的任意命令,可以完全按照规定执行。您可以将它们用于上传,但它们不如已签名的保单文件通用。
由于 Google Cloud Storage 没有上传图片的简单方法 (2014),我最终使用了 Amazon Web Services,它甚至附带了 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
示例附带存储桶用法,他们甚至将文件存储在存储桶中。这样就可以了。确保更改您的凭据:
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
干杯!
我正在尝试使用 JSON API 将图像上传到 Google 云存储上的存储桶中,使用 Javascript 示例: Api Javascript Sample
我可以上传图片,但它要求我登录我的 google 帐户。
示例有一个授权按钮,据我所知管理 OAuth 凭据。
function checkAuth() {
gapi.auth.authorize({
client_id: clientId,
scope: scopes,
immediate: true
}, handleAuthResult);
}
问题是:
我想在没有弹出屏幕的情况下进行身份验证,这意味着不使用 Google 登录。因为我的客户不知道电子邮件或密码,所以我希望它是自动的。
我怎样才能做到这一点?
谢谢!
----------------------------更新---------------- -----
所以根据 Brandon 的回答,我做了以下事情:
我已经创建了我的保单文件并像这样签名:
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);
我的 post 表格如下:
<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="884257827820-so77htet9tafrcjjp83m7api9lh12qsn@developer.gserviceaccount.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 中获得的组合如何,我似乎都无法弄清楚什么进入策略,什么进入签名,是的!我已经阅读了 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>
我应该放什么?
------更新------
请不要复制没有帮助的粘贴文档。 赏金增加
上传对象需要某种形式的授权(您也可以创建一个允许真正匿名写入的存储桶,但这很少是个好主意)。有几种方法可以获取授权。
如您所见,一种方法是让用户登录其 Google 帐户并将其用作授权。如果该应用程序适用于少数知名人士,那是一个不错的选择。
另一种上传图片的方法是使用签名的 URL 或签名形式的保单文件。这允许您的用户使用标准的 HTML 表单来 select 并上传已被您的应用预授权的图像。策略文档是一小段文本,描述了允许用户执行的操作并已由适当的凭据签名。
这是一个政策文件的例子:
{"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]
]
}
本文档指定用户只能使用它来上传具有 bucket-owner-read ACL 的对象,仅用于上传到存储桶 "travel-maps",最多只能上传 1 兆字节的对象,并且很快。然后服务器将使用他们的密钥签署该文档。文档(以 base 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="1234567890123@developer.gserviceaccount.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="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 不同于签名的表格。 "Signed URLs" 是非常具体的任意命令,可以完全按照规定执行。您可以将它们用于上传,但它们不如已签名的保单文件通用。
由于 Google Cloud Storage 没有上传图片的简单方法 (2014),我最终使用了 Amazon Web Services,它甚至附带了 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
示例附带存储桶用法,他们甚至将文件存储在存储桶中。这样就可以了。确保更改您的凭据:
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
干杯!