最新消息:
1.Google Storage For Developers 将免费服务至2011年底,2012年正式开始收费
2.没有账单信息(绑定信用卡)的账户将于2011年8月1日停止服务,下文中演示链接可能失效。
前几天收到Google的邮件,说是之前申请的Google Storage for Developers终于通过了(申请到通过都有半年以上了)。
Google Sotrage(以下简称GS)相关的中文资料在博客园甚至整个墙内都不多
有一篇“Google Storage for Developers初体验”(大家可自行搜索) 但也只是介绍了GSUtil Tool——GS的命令行管理工具(了解GS)
在介绍API之前还是先看看GS是个什么东西以及如何开通吧。
GS是Google提供的一项类似Amazon S3的收费服务,而GS For Developers是提供给开发人员的免费版本,申请需FQ,申请通过后墙内可用(目前)
简单的来说GS提供一块极其稳定和快速的空间用来存储数据,而这些数据可以通过Google提供的一套“RESTful”的API来访问和管理,也可直接外联分享
收到邀请信之后基本跟着 “invite link” 说的做就OK了,成功之后到管理页面选择“Create Access Key” 会生成一串Access Key和一串对应的“Secret”
这一套密钥用来确认你的身份(使用API管理文件的时候通必须过密钥获取权限),一个账号目前最多可以创建五套这样的密钥。
点左边的“Google Storage Manager”访问WEB版的“文件管理器” 。
第一次进去应该是如下的界面,选择右上角的"New Bucket"新建一个Bucket(用户的任何文件都必须隶属于一个Bucket,也就是说根目录下无法直接存放文件)
此时你可能会发现无论Bucket的名字输入什么都会提示“invalid bucket name”,这是因为Bucket的名字是对应域名的,必须与域名同名,免费域名诸如.tk、co.cc均可
具体步骤如下:
输入域名,这里我申请了一个免费的tevins.co.cc域名用来演示,提示The bucket you tired to create requires domain ownership verification.
也就是说这个域名虽然合法但是google并不知道这个域名是否为你所有,点击后面的Verify now认证域名的所有权。
有四种验证域名所有权的方法,分别是添加DNS记录、添加域名主页meta标签、上传HTML文件、关联到Google Analytics账号
我们选择最简单的添加DNS记录,这个方法既不需要虚拟主机也不需要Google Analytics账号,刚申请的裸域名都可以。
再下面有一个下拉框用来选择域名注册商,co.cc和tk没有在内,没关系,直接选择Other
必要关闭此网页按照上图的说明,为tevins.co.cc添加一条TXT记录值为框内的字符串
我的域名使用了DNSPOD的服务,以上为DNSPOD的设置方法,其他的大同小异(主机记录留空或填“@”)
等刚才设置的DNS记录生效,选择Verify就完成了,成功的话会转到如下页面
这里显示了所有已经验证通过了的域名。
至此域名验证过程已完成,回到GS的管理界面,再次添加名为“tevins.co.cc”的Bucket就能成功了。
双击进入创建好的Bucket
根据提示拖入(IE不支持多文件上传)文件即可上传了
新建一个名为Public的文件夹进入,然后拖入一个文件,图为上传界面
上传完成,点击最右边的灰色对钩(Share Publicly),稍等片刻对钩变绿说明文件已经可以外联,右边会出现一个名为“Link”的超链接,即为外联地址,大家可以测试一下速度
Google所称的“RESTful interface”并非是指"you can program with the API restfully"
这里的"RESTful"指的是一种设计风格
下面来看看这个API到底怎么用,上文说到“用户存储的任何文件都隶属于某个Bucket之下”。
一个用户可以有多个Bucket,但是Bucket的命名是严格限制的。
这里Bucket的概念跟Windows里的驱动器盘符很相似,要对GS内的数据进行操作(除了创建一个Bucket)首先要知道这个数据的所在的Bucket
因此我们先从列出所有的Bucket开始。
根据Google的文档使用GET Service可以获取所有的Buckets
这个请求有如下header
发送一个包含这些headers的请求Google会返回的一个XML文档,包含所请求的信息,本例中如下图所示:
可以看到,所有Buckets的信息都在里面了,还是蛮简单的。
代码如下:
说说验证吧
官方的文档里头在验证上花的笔墨也不少,这是因为大多数GS API的操作都需要验证,唯一的例外就是操作允许匿名访问的资源了,比如上文的测试连接就是。
验证的过程本身并不复杂,只要Authorization这个header的值(验证字符串)跟Google服务器计算出的相匹配就验证通过。
但是这个验证字符串来之不易:
上文提到每个用户有一到多套密钥,也就是一个AccessKey和一个相对应的SecretKey
他们就是用来组成和计算验证字符串的
验证字符串的格式如下
Authorization: GOOG1 google_storage_access_key:signature
黑体部分是固定的,也就是验证字符串必须放在“Authorization”这个header内,并以冒号后面的字符串为值,同时以字符串“GOOG1”开头,他用来标识所使用的验证算法和版本,本例中是“GOOG1”
后面接有一个空格,再后面的google_storage_access_key指的是密钥的AccessKey
然后是一个半角冒号再跟着的是Signature。
Signature是一串使用HMAC-SHA1计算而得的哈希值,计算需要用到两个参数,一个是密钥内的SecretKey还有一个是需要被签名的信息(HTTP请求)。
伪代码如下:
现在又有一个未知量——
MessageToBeSigned,它由三个字符串连接依次而成
,伪代码如下:
这三个字符串分别是
CanonicalHeaders、CanonicalExtensionHeaders和CanonicalResource
CanonicalHeaders
CanonicalExtensionHeaders
本例中为空
CanonicalResource
本例中为“/”
按照以上的方法一个验证字符串就诞生了。
题外话:
其实最后的三个字符串,包括所有组成MessageToBeSigned的元素全部都来自于即将发出的HTTP请求本身,目的就在于标识这个HTTP请求,Google之所以这样做是为了确保HTTP请求在网络上传送过程的安全性,使用HMAC SHA1来验证请求,这种验证方式在客户端使用一串密码(仅用户和服务器持有)和发送的信息本身(包括时间)混合起来进行高强度的不可逆加密,得到一串密文;服务器端使用收到的信息和密码使用同样的方式计算出密文,两串密文相同即通过验证。
使用这种方式即使这串密文被截取了也没有办法通过服务器验证,因为每次请求的信息是不完全相同的(即使完全相同时间也不同)因此一串密文只能验证一个时间点的某一个请求。
GS API就先介绍到这里吧,如果有朋友感兴趣我再发点东西上来。