Nov 02
作者: 肖建彬 | 可以转载, 转载时务必以超链接形式标明文章原始出处和作者信息及版权声明
网址:http://www.xiaojb.com/archives/it/sohu-passport-code.shtml

搜狐通行证是伟大的qyb同学加入搜狐后的第一个大作,是成名之作,前几天吃饭还谈起此事,最近几天终于有时间研究一下,今天说一下我从外部学习到的搜狐通行证的东西。

从任意的sohu新闻页面的源代码中可以看到这么一段js




pp18030_5.js是PassportSC这个对象的基本定义,有很多的参数和方法。

pn18030_5.js是每个产品线定制的passport登录框、等待认证框、出错提示框的代码。

之后的代码则是给PassportSC的属性赋值。
appid是分给每个业务线的编号。
isSetFocus是否给登录框焦点,我曾经向qyb同学提出看新闻时登录框有了焦点,导致我无法用空格翻页。
drawPassport方法就是修改newscard这个div内的代码。

  1. 页面调用PassportSC.drawPassport()方法后,该对象从cookie(ppinfo或者passport)中获取登录信息,如果有登录cookie,跳到第8步
  2. draw登录框,表单的onSubmit事件是PassportSC.doLogin
  3. 点登录后,PassportSC将用户email和密码等通过创建的script标签调用passport服务器的登录认证程序
  4. 原本传递的密码是明文的,被我发现了,现在改成了md5过的。

  5. PassportSC将登录框改为登录等待框
  6. 登录认证程序为login_status赋值,登录成功返回值是success,错误会返回errorN
  7. PassportSC分析login_status,打印错误页或者成功的面板
  8. 登录成功后还会调用crossdomain_all.jsp,为所有的域名种下cookie
  9. 方法parsePassportCookie将passport的值解析,获取登录者的信息,获得userid后打印登录成功信息
  10. 各个业务线根据自己的需要调用方法drawPPContInfo修改通行证面板中的部分信息
  11. 退出登录部分跟登录流程基本相似

passport种下的cookie的格式是

1|登录时的时间戳|0|登录者的信息|未知的md5|未知信息;

将登录者的信息做base64解码和utf8到utf16的转换后,得到内容的格式是

userid:20:11111111111@sohu.com|username:3:肖建彬|serviceuse:30:100111000100000000000000000000
|newmail_num:1:0|ip:15:1.2.3.4|did:0:

utf8转码为utf16后,可以在任意字符集的页面显示,提高了兼容性。使用<script charset=”utf-8″> </script>的方法可以保证字符集正确,但是无法保证cookie中解析出来的中文也是正确的。

登录信息中包含了很多故事,userid就是passport的名字,username是真实姓名,serviceuse是该用户都使用了哪些服务,newmail_num是新邮件数目,ip是登录的ip地址,did不知道。

搜狐的新闻页面使用passport面板只从cookie中获取信息,不浪费服务器资源。

受益匪浅。

另:firebug真是个好东西,可以将js的对象看的一览无余。

Tags: , , ,

2 Responses to “学习一下搜狐通行证(qyb大作)”

  1. smzz Says:

    看来什么都逃不过firebug和xiao老师的眼睛,这篇文章分析得实在透彻,收藏先~

  2. runrune Says:

    请问肖哥,搜狐的检测Cookie部分是否需要通过服务器传值验证?