2011年11月24日星期四

Google的云存储技术:Google Storage的开通试用及其API的简单应用


最新消息:
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
但是开发的时候一般也不会在后台去调用这个GSUtil Tool来操作GS吧,因此API才是开发过程中的主角,不过在此之前还是先看看GS是个什么东西以及如何开通吧

介绍

GS是Google提供的一项类似Amazon S3的收费服务,而GS For Developers是提供给开发人员的免费版本,申请需[翻|墙],申请通过后墙内可用(目前)
简单的来说GS提供一块极其稳定和快速的空间用来存储数据,而这些数据可以通过Google提供的一套"RESTful"的API来访问和管理,也可直接外联分享

开通试用

收到邀请信之后基本跟着 "invite link" 说的做空间就激活了,成功之后进到管理页面选择"Create Access Key" 会生成一串Access Key和一串对应的"Secret"
这一套密钥用来确认你的身份(使用API管理文件的时候通必须过密钥获取权限),一个账号目前最多可以创建五套这样的密钥。
点左边的"Google Storage Manager"访问WEB版的"文件管理器" 。
第一次进去应该是如下的界面,选择右上角的"New Bucket"新建一个Bucket(用户的任何数据都必须所属一个Bucket,也就是说根目录下无法直接存放文件)
此时你可能会发现无论Bucket的名字输入什么都会提示"invalid bucket name",这是因为Bucket的名字是对应域名的,必须与域名同名,免费域名诸如.tkco.cc均可
具体步骤如下:
  1. 输入域名,不要加"http://"等,这里我申请了一个免费的tevins.co.cc域名用来演示(上面的两个域名我已经确认了,无视即可),
    提示The bucket you tired to create requires domain ownership verification.
    也就是说这个域名虽然合法但是google并不知道这个域名是否为你所有,点击后面的Verify now认证域名的所有权。
  2. 有四种验证域名所有权的方法,分别是添加DNS记录、添加域名主页meta标签、上传HTML文件、关联到Google Analytics账号
    我们选择最简单的添加DNS记录,这个方法既不需要虚拟主机也不需要Google Analytics账号,刚申请的裸域名都可以。
    再下面有一个下拉框用来选择域名注册商,co.cc和tk没有在内,没关系,直接选择Other
  3. 必要关闭此网页按照上图的说明,为tevins.co.cc添加一条TXT记录值为框内的字符串

    我的域名使用了DNSPOD的服务,以上为DNSPOD的设置方法,其他的大同小异(主机记录留空或填"@")
  4. 等刚才设置的DNS记录生效,选择Verify就完成了,成功的话会转到如下页面

    这里显示了所有已经验证通过了的域名。
  5. 至此域名验证过程已完成,回到GS的管理界面,再次添加名为"tevins.co.cc"的Bucket就能成功了。
双击进入创建好的Bucket
根据提示拖入(IE不支持多文件上传)文件即可上传了
新建一个名为Public的文件夹进入,然后拖入一个文件,图为上传界面
上传完成,点击最右边的灰色对钩(Share Publicly),稍等片刻对钩变绿说明文件已经可以外联,右边会出现一个名为"Link"的超链接,即为外联地址,大家可以测试一下速度

API的使用

Google所称的"RESTful interface"并非是指"you can program with the API restfully",no!no!no!验证部分可以把人搞疯掉(下面的演示代码大部分都是为了验证)
这里的"RESTful"指的是一种设计风格(虽然不是一种标准,但是这样理解可能更容易些),因此在开篇我就直接引用了单词"RESTful"。
GS API的实现依赖标准的HTTP方法,诸如如DELETE, GET, HEAD, 还有 PUT,熟悉web service的话应该很容易上手。
废话不多说,下面来看看这个RESTful的API到底是个什么东西。
上文提到了一个概念"用户存储的任何数据(文件)都所属于某个Bucket之下"。
一个用户可以有多个Bucket,但是Bucket的命名是严格限制的。
说到这里Bucket的概念跟Windows里的驱动器盘符就很相似了,要对GS内的数据进行操作(除了创建一个Bucket)首先要知道这个数据的所在的Bucket
因此我们先从列出所有的Bucket开始。

Google的文档告诉我们使用GET Service可以获取所有的Buckets
因此我们按照Google的要求发送一个符合条件的HTTP请求即可。
这个请求有如下头域(header)
  • Authorization      验证字符串
  • Content-Length       HTTP请求内容的长度
  • Date         HTTP请求的日期
  • Host         Google Storage服务器的URI
每个header都是必须的
Authorization        这个问题相对而言最麻烦了,后面再说
Content-Length      在此例中应该为0,因为发送的HTTP请求只包含若干header,body部分为空
Date        请求发送的日期,看起来很简单但是设置这个Date还真是耗了我不少时间(见代码注释)
Host        确实很简单,Google有提供,一串URI就行了 

这就是全部了,发送一个包含这些headers的请求然后等着Google的回应就行了。
从服务器返回的response是一个XML文档,包含所请求的信息,本例中如下图所示:
可以看到,所有Buckets的信息都在里面了,取得了这个XML文档之后进行解析就能得到我们想要的数据了。
还是蛮简单的。
代码如下:
//GoogleStorage账号的一套密钥
string AccessKey =@"你的AccessKey";string secretKey =@"你的secretKey ";
//声明一个http请求
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"https://commondatastorage.googleapis.com/");
request.ContentType
=@"application/xml";
request.Method
="GET";
request.ContentLength
=0;//Google要求的时间格式
string timeStamp = DateTime.UtcNow.ToString(@"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'", CultureInfo.GetCultureInfo("EN-US"));
request.Headers.Add(
"Data", timeStamp);
request.KeepAlive
=false;
request.Date
= DateTime.UtcNow; //试了很多办法依旧没找到.Net 4.0以下版本为HttpWebRequest设置Date属性的办法,知道的朋友请指教 !
string canonicalHeaders =string.Format("{0}\n{1}\n{2}\n{3}\n", request.Method, string.Empty, request.ContentType, timeStamp);string canonicalExtensionHeaders =string.Empty;string canonicalResource ="/";
string signedMessage =string.Format("{0}{1}{2}", canonicalHeaders, canonicalExtensionHeaders, canonicalResource);
string signature = Convert.ToBase64String(new HMACSHA1(Encoding.UTF8.GetBytes(secretKey)).ComputeHash(Encoding.UTF8.GetBytes(signedMessage)));
string authString =string.Format("GOOG1 {0}:{1}", AccessKey, signature);
request.Headers.Add(
"Authorization", authString);
try
{
HttpWebResponse response
= (HttpWebResponse)request.GetResponse();
MessageBox.Show(response.StatusCode.ToString());

//格式化XML文档
XmlDocument doc =new XmlDocument();
doc.Load(response.GetResponseStream());
//发送HTTP请求并获取回应(XML文档)
MemoryStream ms =new MemoryStream();
doc.Save(ms);
string xml = Encoding.UTF8.GetString(ms.GetBuffer());
ms.Close();
//格式化XML文档
tbxOut.Text = xml; //显示XML文档
}catch (WebException ex)
{
MessageBox.Show(ex.Message);
Stream stRes
= ex.Response.GetResponseStream();
StreamReader srRes
=new StreamReader(stRes);
string xml = srRes.ReadToEnd();
tbxOut.Text
= xml;
}

好了,看完了代码,再来讨论这个严峻的验证问题吧
官方的文档里头在验证上花的笔墨也不少,这是因为大多数GS API的操作都需要验证,唯一的例外就是操作允许匿名访问的资源了,比如上文的测试连接就是。
验证的过程本身并不复杂,只要Authorization这个header的值(验证字符串)跟Google服务器计算出的相匹配就验证通过。
但是这个验证字符串来之不易:
上文提到每个用户有一到多套密钥,也就是一个AccessKey和一个相对应的SecretKey
他们就是用来组成和计算验证字符串的
验证字符串的语法如下
Authorization: GOOG1 google_storage_access_key:signature
黑体部分是固定的,也就是验证字符串必须放在"Authorization"这个header内,并以冒号后面的字符串为值。
这里的GOOG1就是字符串"GOOG1",他(Signature identifier)用来标识所使用的验证算法和版本,Google Storage的Signature identifie就是"GOOG1"
跟着后面的是一个空格,然后google_storage_access_key指代的是密钥的AccessKey
然后是一个冒号(当然是半角)再跟着的是Signature(下面说明)。
Signature是一串使用HMAC-SHA1计算而得的哈希值,计算需要用到两个参数,一个是密钥内的SecretKey还有一个是需要被签名的信息(HTTP请求)。
伪代码如下:

Signature = Base64-Encoding-Of(HMAC-SHA1(UTF-8-Encoding-Of(YourGoogleStorageSecretKey, MessageToBeSigned)))
现在又有一个未知量——MessageToBeSigned,它由三个字符串连接依次而成,伪代码如下:

MessageToBeSigned = UTF-8-Encoding-Of(CanonicalHeaders + CanonicalExtensionHeaders + CanonicalResource)
这三个字符串分别是 CanonicalHeaders、CanonicalExtensionHeaders和CanonicalResource
CanonicalHeaders
CanonicalHeaders = HTTP 方法 +"\n"+  HTTP请求内容的MD5值 +"\n"+
请求内容类型
 +"\n"+
日期
+"\n"
CanonicalExtensionHeaders
本例中为空
CanonicalResource
本例中为"/"
按照以上的方法一个验证字符串就诞生了,最后的三个字符串我就不在这里当翻译了,大家可以自行到google的文档里头去看。
题外话:
其实最后的三个字符串,包括所有组成MessageToBeSigned的元素全部都来自于即将发出的HTTP请求本身,目的就在于标识这个HTTP请求,Google之所以这样做是为了确保HTTP请求在网络上传送过程的安全性,虽然GS支持HTTPS连接,但是本质上HTTPS同HTTP一样,也是不安全的。也就是说通过HTTP/HTTPS在网络上传输的信息有被截取的可能,大家想想,如果你的密码直接以明文方式传送有多么危险,当然了,即使是MD5之类的不可逆算法加密过后的密文也无济于事,因为虽然算法不可逆,但是服务器验证的是MD5的密文,也就是说只要知道密码的MD5值就可以通过验证了,根本不需要知道原密码,因此HMAC SHA1这类验证方式应运而生,这种验证方式在客户端使用一串密码(仅用户和服务器持有)和发送的信息本身(包括时间)混合起来进行高强度的不可逆加密,得到一串密文;服务器端使用收到的信息和密码使用同样的方式计算出密文,两串密文相同即通过验证。
使用这种方式即使这串密文被截取了也没有办法通过服务器验证,因为每次请求的信息是不完全相同的(即使完全相同时间也不同)因此一串密文只能验证一个时间点的某一个请求。

GS API就先介绍到这里吧,如果有朋友感兴趣我再发点东西上来。

2011年11月22日星期二

Blogger和Google Sites绑定域名方法


From Evernote:

Blogger和Google Sites绑定域名方法 - 子东网志:Zidon's Blog

Clipped from: http://zidon.lvwo.org/2008/10/blogger-and-google-sites-binding-domain.html

Blogger和Google Sites绑定域名方法

Posted On 2008-10-15 at 下午11:17:00 by zidon
Blogger和Google Sites都是Google很不错的服务,而且两者支持用户个人域名的绑定,其实很简单:

1. 若要将域名绑定到Blogger,需登录Blogger管理后台,在设置-发布中,选择自定义域发布中,填上你要绑定的域名;

2. 若要将域名绑定到Google Sites,需登录你的Google Sites管理后台,在Site settings-Web Address中,填上您要绑定的域名,Google Sites支持多个域名的绑定;

3. 然后再你的域名管理后台,将你要绑定的域名创建CNAME记录(别名),将主机名指向到ghs.google.com就ok了。

4. 但实际国内的用户,用以上方法并不一定能达到可以访问的目的,因ghs.google.com经常有被封的时候,所以国内的用户在用自己的域名绑定Google服务的时候,在自己域名管理后台需如下设置:

a、首先建ghs.yourdomain.com二级域名A记录指向到如下ip列表中的一个,选择哪一个,看你能ping通的即可:
216.239.32.21
216.239.34.21
216.239.36.2
216.239.38.21

b、然后将你要绑定到Google服务的域名CNAME记录(别名)指向到这个ghs.yourdomain.com即可生效了。

下面是我绑定的Google相关的服务:
Google Sites:http://site.zidon.org
Blogger:http://blog.zidon.org

什么是正向代理和正向代理服务器



1.什么是正向代理和正向代理服务器? 


正向代理就是通常所说的代理,是某台电脑通过一台服务器来上Internet网的这种方式,其中这台电脑就叫客户机,这台服务器就叫正向代理服务器也就是通常所说的代理服务器。在这种方式中,你是主动的,网站是被动的,网站那里不能得到你的真实ip地址。(通俗讲法) 


正向代理服务器。它只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器(一般在IE-Internet选项-连接-局域网设置),并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。 


2.什么是反向代理和反向代理服务器? 


反向代理就是网站通过一台服务器发布到公网,供用户访问。用户直接访问那台反向代理服务器,然后通过那台服务器访问到网站。用户无法得到网站的真实IP地址。这样就保护了网站服务器,如果您有台服务器在国内又不想让人找到IP,就可以在国外搭建一台反向代理服务器。一个反向代理服务器将很多网站解析到同一 ip地址上。(通俗讲法) 


技术讲法,普通的Web代理服务器是不支持外部对内部网络的访问请求的。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。此时的代理服务器称为反向代理服务器,对外表现为一个Web服务器,外部网络就可以简单把它当作一个标准的Web服务器而不需要特定的配置。不同之处在于,这个服务器没有保存任何网页的真实数据,所有的静态网页或者CGI程序,都保存在内部的Web服务器上。因此对反向代理服务器的攻击并不会使得网页信息遭到破坏,这样就增强了Web服务器的安全性。 


反向代理用于外部网络访问内部网络时使用,正向代理用于提供内部网络对外部网络的访问能力,并可以使用包过滤拒绝其他方式访问外部网络。

2011年11月20日星期日

4G可外链Google网盘


博客运行时间长了,有些文件要向读者提供下载,拥有一个网盘必不可少,但是目前国内许多网盘都不支持外链,像115,纳米盘,Rayfile等,有些文件保存时间又有限制,不是很方便。Google网盘目前向我们提供达4G容量可以外链的存储空间,用来存放网站文件非常适合,使用又简单,上传速度也很快,单文件限制大小100M,而我感觉到最重要的还是它支持外链。

Project Hosting

Google网盘申请方法十分简单,如下操作:

1.打开网址:http://code.google.com/hosting/

2.点击 "Sign in to create a project(登录以创建一个项目)"。

3.用你的google帐户登录,如果未有则创建一个。

4.登录后点击"Create a new project(创建新项目)"。

Project Hosting-2

5.上图中的ProjectName是项目名称,也是以后访问此网盘的域名,比如我的是chenchunlin,访问网盘时的域名就是:http://code.google.com/p/chenchunlin/。其他的选项都可以随意填写,自己明白就得了。

6.到此,你已经拥有一个4G大的网盘了,点Downloads,然后再点 New Download就可以上传文件了。文件上传也很简单,看下图就明白了:

Project Hosting-4

文件上传后的截图:

Project Hosting-3

值得注意的是:Google网盘是不支持上传中文名文件的,所以上传文件时最好先修改成英文名。

如无特别说明,本站文章皆为原创,若要转载,必须注明以下原文信息:
日志标题: 《4G可外链Google网盘》
日志链接: http://www.chenchunlin.info/4g-google-wang-pen.html
博客名称: Chenchunlinblog



准备开始写博客之前的想法


        一直以来都不太写博客,有时候看到好的文章想收藏却苦于没有系统而快捷的方法。曾经写的东西或收藏的文章都太零散,以至于现在都很难找到。几年以来经常在网上瞎逛,东看看西看看,乐此不疲。当然会找到很好的资源,但一般都当作书签存储,时间一久,都不知道我到底收藏了多少资源,更可恨的是要用的时候已经找不到了。所以,现在决定养成写博客的习惯,把资源系统的整理一下,以便日后检索。
       接下来第一件要做的事便是找博客。对此要求有:1、服务稳定,2、数据安全,3、撰写方便。4、访问方便。5、言论自由。6、界面自定义。7、被搜索率。
        我特别喜欢google的服务,对于blogger也偏爱有加,只是很早就被墙了,非常可惜。但是几年来一直观察着它,感觉blogger的服务非常的好,除了访问不便外,其他各项指标都是无可挑剔的。
        国内的博客服务有接触的如新浪、网易、百度、天涯、qq空间,还有其他如360图书馆、博客园、cndn等等,品种繁多,琳琅满目。但是也可能因为太多,让我眼花缭乱,以至于我会认为,随随便便就提供的免费博客服务,质量不会太好。当然这种想法很不理性,但却是影响着我的选择。同时,对于国内的博客服务,有两点我感到不太喜欢。第一,国产货。呵呵,非常的没有根据,纯属个人感觉。因为我觉得国内很难提供像国外(如google)那样的服务质量,不管是博客还是其他任何产品!这是个人感觉而已,但并不是说我认为国外的月亮比中国圆。第二,没有言论自由。虽然我并不想发表一些异见,但国内的审查制度令我极为不满,我认为这严重的侵犯了我的言论自由权!虽然我们很爱国,虽然我们很安分,但是共党的这种行径显然是不信任我们的,仗着权势违反宪法欺压我们平民百姓。这让我感觉活在这个国家缺少尊严,很不体面。话题扯远了,呵呵。综合以上两点原因,所以我并不喜欢国内的博客服务。但是blogger又被墙。所以,并没有一个非常如意的选择。
       由于本人比较懒,因此希望可以用邮件发布文章。这几天折腾了好几个博客服务,总结如下:鉴于可以通过blogger提供的邮件发博服务可以方便的更新博客(当然,这仍需要有可靠的翻&墙技术)。因此,blogger当作为我的主要博客,用于备份文章,并可同步到twitter。而国内的博客如网易和qzone空间也提供邮件发博,但qzone是给小屁孩玩的,故排除。因此网易可作为第二选择。好了,先把这个计划落实好再说了。


2011年11月18日星期五

开源免费绿色翻墙代理ASProxyWing v0.7.6


ASProxyWing是款开源免费绿色HTTP代理客户端,支持Windows、Linux、Mac。启动程序时会自动连接代理服务器,点击"Add/Edit Servers"可添加/编辑代理服务器。使用ASProxy Wing需安装Microsoft .NET Framework 2.0;需对浏览器HTTP代理服务器进行设置(IE、Chrome不用设置,程序启动时自动配置),HTTP、HTTPS代理:127.0.0.1,端口:9991

官方项目主页:http://asproxywing.sourceforge.net/index.html
or http://sourceforge.net/projects/asproxywing/

官方下载页面:http://asproxywing.sourceforge.net/get.html

2011-11-15 更新 ASProxyWing 0.7.6 客户端 (559.3 kB)
下载地址: ASProxyWing-Client-0.7.6.zip

如果官方下载被封锁,请留言告知,我们来提供下载地址。

另外:
官方还提供了服务器端,可以自己架设代理服务器。不过目前只是支持asp空间,不支持php,有点遗憾了。不然,我们也来架设一个了。