PHP

discuz的那点事儿

背景介绍:目前的论坛是直接使用Discuz!搭建的,版本比较古老,一直没人动过,从我接收就一直感觉是个烫手的山药,不是说处理不了(凭我浸淫php多年的经验,想来这点毛毛论坛还是可以拿下的,只是前人改过不少代码,注释也没有,于是一直懒得动),但是最近产品部说要整改论坛了,只好捡起来从头开始研究,记录下点滴。
本文先说下跟人人网连接,直接使用connect那套系统就行了,简单的很。
1,引入一个JS,比如命名为connect.js

function addScript(src) {
   var scriptElement = document.createElement("script");
   scriptElement.type = "text/javascript";
   scriptElement.src = src;
   document.getElementsByTagName("HEAD")[0].appendChild(scriptElement);
}
function connectDyload() {
  addScript("http://static.connect.renren.com/js/v2.0/FeatureLoader.jsp?loaded=connectInit");
}
function connectInit() {
  XN_RequireFeatures(["Base"], function(){
    XN.Main.init("efc590d209f847c1ae0d830dcb99c972", "/xd_receiver.html", {"doNotUseCachedConnectState":true});
    XN.Connect.c(function() {
      document.location = "http://www.rrgbbs.com/toGamebbs.do?tid=&redirectUrl="+window.location.href;
    });
  });
}

其中,connect成功后的跳转地址,自己写了个java类,toGamebbs,这个类用来调用Discuz!的一系列验证方式,比如判断用户是不是登录过了cdb_session表,然后新用户的话,自动在后台帮助用户完成注册功能。
2.把模版中的header.html的登录块注释掉,换成connect的代码


登录
{lang logout}
3.修改全局变量template/default/templates.lang.php,把home_welcome_guest修改为上面类似的登录模块

人人网用户请直接点击登录,以浏览更多精彩内容,并随时发布观点,与大家交流。

4.需要在本地放一个跨域文件xd_receiver.html




    





更多renren connect的原理,可以参考官方网站 http://wiki.dev.renren.com/wiki/%E4%BA%BA%E4%BA%BAConnect

公司的passport验证原理

最近为了安全考虑,出了套验证机制。passport处理未登录用户的过程大致为:
1.用户访问应用服务器A
2.如果用户未登录A,自动重定向到passport服务器
3.passport验证登录成功后,返回验证票
4.应用服务器A使用验证票到passport服务器进行二次验证
5.passport二次验证成功后,返回用户名

根据上述处理过程,passport的使用方法为:
1.passport的请求地址为:passport.no.xxxx.com;
2.应用服务器请求passport页面时,需提供forward跳转参数;
3.passport接收请求,验证正确的情况下,返回验证票(ticket参数);
4.应用服务器二次验证的过程为:
1)构造HTTP REFERER请求头;
2)携带HTTP REFERER请求头,远程读取passport.no.xxxx.com/verify.php?t=$ticket(该$ticket为 passport返回的ticket)地址的内容;
3)如果passport验证成功,返回用户名,否则返回空串。

passport的使用示例如下(以MM系统为例http://mm.renren.com/index.php):
1.MM请求访问passport的地址:https://passport.no.xxxx.com/login.php?forward=http://mm.renren.com/index.php
2.passport验证成功后,将地址重定向到http://mm.renren.com/index.php/index.php?ticket=nscr3omh80rn367h5pu0dq76u0
3.MM系统处理passport验证票($ticket参数)的过程为:

   function auth_check_valid($ticket){
       if($ticket == "")
           return false;

       $opts=array(
           'http'=>array(
               'header'=>"Referer :".$_SERVER['REQUEST_URI']
           )
       );

       $context = stream_context_create($opts);//构造HTTP REFERER头   
       $url = "https://passport.no.xxxx.com/verify.php?t=".$ticket;
       $user_id = file_get_contents($url,false,$context);//二次验证,远程请求用户名       
       return $user_id;//返回登录用户名,需进行后续判断是否为空串
   }

在接下来的文章中,我们会进一步讲解如果使用程序模拟登录验证系统,该怎么处理。