康盛创想 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_fopen
用fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
发送数据,这是用到套接字发送方式,用http
协议发送数据的。
发送时并附上cookie
,uc_api_mysql
则不用带cookie
,此处的cookie
大概是为了安全校验的,其实这里也可以用soap
,curl
的发送方式的。
它把$module
和$action
转换成m=$module&a=$action
这样的字符串做为$postdata
发送。
我们再到uc_server
看一下它是如何接收数据的。http://localhost/comsenz/ucenter/index.php
是接收数据的入口。
uc_server
根据接收到的 m
和a
(模块和动)转入到UC_ROOT.RELEASE_ROOT."control/$m.php
的 on$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.
'&code='.urlencode($this->authcode('action=synlogin&username='.$this->user['username'].'&uid='.$this->user['uid'].'&password='.$this->user['password']."&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