杨庆荣的博客

工作之余接单:公司产品展示网站建设、电商网站建设、小程序、app开发。+86 13714715608

康盛创想 ucenter 学习(一) :用户注册以及用户同步登录

点击 15336    创建时间 2011-01-09 21:54:37

作者:杨庆荣 http://wudimei.com/m/yangqingrong 转载请注明出处

一、模块说明 我对康盛创想的sso很感兴趣,所以再次学习它的结构和原理。 用户中心服务器包含的模块有: 1.基本设置。时间设置,短消息设置。 2.注册设置。对email和用户名的设置。 3.邮件设置。发送人及发送方法。 4.应用管理。这是重点!!!! 应用包含有应用名,url地址,ip,通信密钥,应用类型,物理路径,个人资料,是否同步登录,是否接受通知等。 5.用户管理。基本的用户信息:头像,用户名,密码,邮件地址,注册日期,注册ip。 6.管理员。其实是拥有管理权的用记。 7.短消息模块。 ... 以下有积分兑换,词语过滤,域名解析,数据备份,数据列表,更新缓存,插件等功能先略去,第一章我不想写太多。累人啊,哥们。

注册:

注册的地址是http://localhost/comsenz/bbs/member.php?mod=register,让我们来以这个地址为入口看代码。

<form action="member.php?mod=register"> ... </form> 

可见注册后还是发回到member.php?mod=register,打开bbs/source/module/member/member_register.php这文件你会发现这样的代码:

 $uid = uc_user_register($username, $password, $email, $questionid, $answer, $_G['clientip']); 

它的定义是这样的:

 define('UC_API_FUNC', UC_CONNECT == 'mysql' ? 'uc_api_mysql' : 'uc_api_post'); 
 //...... 
 function uc_user_register($username, $password, $email, $questionid = '', $answer = '', $regip = '') { 
    return call_user_func(UC_API_FUNC, 'user', 'register', 
        array('username'=>$username, 'password'=>$password, 'email'=>$email, 'questionid'=>$questionid, 'answer'=>$answer, 'regip' => $regip)
    ); 
 } 

其中php系统函数call_user_func的定义的这样的:


 mixed call_user_func ( callback $function [, mixed $parameter [, mixed $... ]] ) 

所以得知uc_api_mysql和uc_api_post是两个函数,用来负责和uc_server服务端程序通信的。定义如下

 function uc_api_mysql($model, $action, $args=array()) { } 

$model$action路由到uc_client/control/$model.php里面的方法on$action(){...} 所以我们根据找到uc_client/control/user.php里面的onregister方法。

 function onregister() { 
    //... 
    $uid = $_ENV['user']->add_user($username, $password, $email, 0, $questionid, $answer, $regip); 
    return $uid; 
 } 

其中$_ENV['user']是一个mode的变量,我一般是用到时才初始化变量的。这样就插入到了uc_server数据库里面了。

数据库注册方式就告一段落了,我们再来看一下用post通讯方式。

 function uc_api_post($module, $action, $arg = array()) { 
 return uc_fopen2(UC_API.'/index.php', 500000, $postdata, '', TRUE, UC_IP, 20); 
 } 

在中,程序向UC_API.'/index.php'发送数据,并把结果做为函数的返回值。其中UC_API的值是这样的:http://localhost/comsenz/ucenter uc_fopenfsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);发送数据,这是用到套接字发送方式,用http协议发送数据的。 发送时并附上cookie,uc_api_mysql则不用带cookie,此处的cookie大概是为了安全校验的,其实这里也可以用soap,curl的发送方式的。 它把$module$action转换成m=$module&amp;a=$action这样的字符串做为$postdata发送。

我们再到uc_server看一下它是如何接收数据的。http://localhost/comsenz/ucenter/index.php是接收数据的入口。 uc_server 根据接收到的 ma(模块和动)转入到UC_ROOT.RELEASE_ROOT."control/$m.phpon$action()方法内处理。 找到

 function onregister() { 
    //... 
    $uid = $_ENV['user']->add_user($username, $password, $email, 0, $questionid, $answer, $regip); 
 } 

在中,服务器端同样把数据插入到user表里面。

这样可以看出,无论是uc_api_mysql还是uc_api_post,都是要把数据插入到ucenter服务器的数据库内的。

我们再来看同步登录:

 function onsynlogin() { 
    //...... 
    foreach($this->cache['apps'] as $appid => $app) { 
    $synstr .= '<script type="text/javascript" src="'.$app['url'].'/api/uc.php?time='.$this->time.
    '&amp;code='.urlencode($this->authcode('action=synlogin&amp;username='.$this->user['username'].'&amp;uid='.$this->user['uid'].'&amp;password='.$this->user['password']."&amp;time=".$this->time, 'ENCODE', $app['authkey']))
    .'"></script>' 
    }//end foreach 
 } 

可以ucenter是用javascript的方式来通知应用同步登录的。也就是用<script src="$url"></script>这样的方式方问其它应用的登录通知接口,有几个应用就对应几个通知接口<script >的调用。

api/uc.php中,我们可以看到,其它应用接收到通知,立即验证登录是否有效,如果有效,立即设置cookie以表示这个应用登录过了。

function synlogin($get, $post) { 
    //... 
    $cookietime = 31536000; 
    $uid = intval($get['uid']); 
    $query = DB::query("SELECT uid, username, password FROM ".DB::table('common_member')." WHERE uid='$uid'"); 
    if($member = DB::fetch($query)) { 
        dsetcookie('auth', authcode("$member[password]/t$member[uid]", 'ENCODE'), $cookietime); 
    } 
}

上一篇: 先杀鱼后称,先称后再杀鱼
下一篇: wudimei.js ajax request