用Google朋友群来做网站会员登录

2009年07月30日

既然网站可以使用OPENID来进行会员登录,而Google朋友群(GFC)与OPENID有异曲同工之妙,能不能使用GFC来进行用户身份验证和登录呢?GFC提供了许多功能强大的小工具(Gadget),比OPENID的单纯验证功能可要强多了。

很多地方介绍GFC的时候都说它只能用现成的Gadget,而Gadget是在Google自己的IFRAME中运行的,网站无法真正与Gadget实现交互功能。其实GFC还提供了更深层次的开发接口,可以把GFC和网站做更好的结合。我们就用GFC实现了会员的免注册登录。运行该功能的网站可以看:蓝天游戏

下面介绍一下实现的过程。首先在网站上放置一个GFC登陆的按钮,用户登录完毕以后,其浏览器将被放置一个名为“fcauth+siteid”的Cookie,例如我的网站蓝天游戏所申请到的GFC siteid为:00093814801554386538,那么这个Cookie的名字就是:fcauth00093814801554386538,Cookie的值则是一个很长的只有GFC自己才读得懂的乱七八糟的字符串。注意这个Cookie是以本网站也就是http://game.bluesky.cn的DOMAIN来放置的,而不是GFC的DOMAIN,虽然放置的动作时GFC的脚本进行的。也只有这样网站的服务端才有可能读取到这个Cookie来进行后续的处理。这个Cookie的生存时间有几十天,除非用户进行了GFC Logout操作。

GFC登录完成以后浏览器被设置了Cookie,但这个Cookie的值网站服务端并不知道,因为那其实是GFC的脚本干的。这样就需要在GFC登录完成以后让用户跳转访问网站的某个网页例如gfclogin.aspx,从而让服务端获得Cookie的值。

以上工作只用客户端javascript就可以实现,在登录的页面上放如下的代码:

<html>
<head>
<!-- Load the Google AJAX API Loader -->
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
 
<!-- Load the Google Friend Connect javascript library. -->
<script type="text/javascript">
  google.load('friendconnect', '0.8');
</script>
 
<!-- Initialize the Google Friend Connect OpenSocial API. -->
<script type="text/javascript">
google.friendconnect.container.setParentUrl('/' /* location of rpc_relay.html and canvas.html */);
google.friendconnect.container.initOpenSocialApi({
  site: '00093814801554386538',
  onload: function(securityToken) { initAllData(); }
});
</script>
 
 
<script type="text/javascript">
    function initAllData() {
	if (!window.timesloaded) {
	    window.timesloaded = 1;
	} else {
	    window.timesloaded++;
	}
	if (window.timesloaded > 1) {
	    window.top.location.href = "/gfclogin.aspx";
	}
	google.friendconnect.renderSignInButton({
		"id" : "gfc-button",
		"text" : "使用Google朋友群登录",
		"style" : "long"
      	});
    };
 
</script>
<p><b>您可以使用Google朋友群直接登录,免去注册麻烦:</b></p>
<p><div id="gfc-button"></div><p></p>

在这段代码中,我们用window.timesloaded来判断什么时候进行跳转到网站的登录处理页面gfclogin.aspx。页面装载的时候initAllData()函数会被调用一次,这样window.timesloaded的值被置为1;当用户完成GFC登录返回时initAllData()函数会被再调用一次,window.timesloaded的值就会大于1了,我们由此判断用户浏览器已经获得fcauth Cookie,可以跳转到gfclogin.aspx去读取这个Cookie了。

页面跳转到gfclogin.aspx以后,服务端取出fcauth Cookie的值,然后去访问GFC提供的REST接口:

http://www.google.com/friendconnect/api/people/@viewer/@self?fcauth=

这个接口将返回一个JSON编码的用户信息,其中包含用户的ID、Displayname、thumbnailUrl等。例如:

{"entry":{"id":"12861121234561060104","thumbnailUrl":"http://www.google.com/friendconnect/profile/picture/vEFtfSziHNp1-FhHvi3DPwdKr3_5papNKXh9Mj-4EtCX4vnVqIsybr2mC24JjqaaaaDnX3TM3otF6O37i51IBnBvotNp6F_IUaaaatA1VgLTtIpbpyzuWQ","photos":[{"value":"http://www.google.com/friendconnect/profile/picture/vEFtfSziHNp1-FhHvi3DPwdKr3_5papNKXh9Mj-4EtCX4vnVqIsybr2mC24JjqJojbaaaaTM3otF6O37i51IBnBvotNp6F_IUIaaaaA1VgLTtIpbpyzuWQ","type":"thumbnail"}],"displayName":"aaaa"}}

我们解析JSON数据取出id和displayName两项,然后查询数据库看这个id的用户有没有登录过,如果是第一次登录的话,往用户数据库加一条记录记下其id和displayName。然后设置好Session,是该用户处于已登录状态。

如果是php的话可以用CURL去获取GFC接口的返回内容,我们是用C#,就采用了如下的函数:

    public string getContent(string Url)
    {
        string strResult = "";
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
            //声明一个HttpWebRequest请求
            request.Timeout = 30000;
            //设置连接超时时间
            request.Headers.Set("Pragma", "no-cache");
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream streamReceive = response.GetResponseStream();
            Encoding encoding = Encoding.GetEncoding("UTF-8");
            StreamReader streamReader = new StreamReader(streamReceive, encoding);
            strResult = streamReader.ReadToEnd();
            streamReader.Close();
        }
        catch
        {
            throw;
        }
        return strResult;
    }

对获取回来的JSON数据的处理则使用了Newtonsoft.Json,下载软件以后将其bin目录下的Newtonsoft.Json.dll放置到asp.net站点的bin目录下就可以使用了。

代码如下:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

string resturl = "http://www.google.com/friendconnect/api/people/@viewer/@self?fcauth=" + fccookievalue;
string content = getContent(resturl);
JObject o = JObject.Parse(content);
string fcid = (string)o["entry"]["id"];
string nickname = (string)o["entry"]["displayName"];

我们在蓝天游戏网站上结合使用了GFC所提供的许多功能,包括利用GFC来进行会员登录验证、会员小工具、评论小工具、推荐小工具等等,效果比较满意。

GFC比OPENID更有一个优点就是:从GFC那里获得的用户ID是唯一的20位长度的数字,不象OPENID的URL长长短短的每个人都大不一样。这样在数据库中保存和处理用户ID就比较方便了,用不着象OPENID一样还要先进行URL的标准化。





标签: , , ,
归类: OPENID

Leave a Reply

*

您也可以使用微博账号登陆