搜狐通行证是伟大的qyb同学加入搜狐后的第一个大作,是成名之作,前几天吃饭还谈起此事,最近几天终于有时间研究一下,今天说一下我从外部学习到的通行证的东西。
从任意的sohu新闻页面的源代码中可以看到这么一段js
<scrīpt src="http: // www.sohu.com / passport / pp18030_5.js">< / scrīpt >
< scrīpt src = " http://www.sohu.com/passport/pn18030_5.js " >< / scrīpt>
<scrīpt>
PassportSC.appid = 9997;
PassportSC.max_line_length = 40;
PassportSC.isSetFocus = false;
PassportSC.drawPassport(document.getElementById("newscard"));
< / scrīpt >
pp18030_5.js是PassportSC这个对象的基本定义,有很多的参数和方法。
pn18030_5.js是每个产品线定制的passport登录框、等待认证框、出错提示框的代码。
之后的代码则是给PassportSC的属性赋值。
appid是分给每个业务线的编号。
isSetFocus是否给登录框焦点,我曾经向qyb同学提出看新闻时登录框有了焦点,导致我无法用空格翻页。
drawPassport方法就是修改newscard这个div内的代码。
- 页面调用PassportSC.drawPassport()方法后,该对象从cookie(ppinfo或者passport)中获取登录信息,如果有登录cookie,跳到第8步
- draw登录框,表单的onSubmit事件是PassportSC.doLogin
- 点登录后,PassportSC将用户email和密码等通过创建的scrīpt标签调用passport服务器的登录认证程序
原本传递的密码是明文的,被我发现了,现在改成了md5过的。
- PassportSC将登录框改为登录等待框
- 登录认证程序为login_status赋值,登录成功返回值是success,错误会返回errorN
- PassportSC分析login_status,打印错误页或者成功的面板
- 登录成功后还会调用crossdomain_all.jsp,为所有的域名种下cookie
- 方法parsePassportCookie将passport的值解析,获取登录者的信息,获得userid后打印登录成功信息
- 各个业务线根据自己的需要调用方法drawPPContInfo修改通行证面板中的部分信息
- 退出登录部分跟登录流程基本相似
passport种下的cookie的格式是
1|登录时的时间戳|0|登录者的信息|未知的md5|未知信息;
将登录者的信息做base64解码和utf8到utf16的转换后,得到内容的格式是
|newmail_num:1:0|ip:15:1.2.3.4|did:0:
utf8转码为utf16后,可以在任意字符集的页面显示,提高了兼容性。使用<scrīpt charset=”utf-8″> </scrīpt>的方法可以保证字符集正确,但是无法保证cookie中解析出来的中文也是正确的。
登录信息中包含了很多故事,userid就是passport的名字,username是真实姓名,serviceuse是该用户都使用了哪些服务,newmail_num是新邮件数目,ip是登录的ip地址,did不知道。
搜狐的新闻页面使用passport面板只从cookie中获取信息,不浪费服务器资源。
受益匪浅。
另:firebug真是个好东西,可以将js的对象看的一览无余。
作者: 肖建彬 | 可以转载, 转载时务必以超链接形式标明文章原始出处和作者信息及版权声明
网址:http://www.xiaojb.com/archives/it/sohu-passport-code.shtml