杨庆荣的博客

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

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

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

<p> <br /> 作者:杨庆荣 http://wudimei.com/m/yangqingrong 转载请注明出处</p> <p> <strong>一、模块说明</strong><br /> 我对康盛创想的sso很感兴趣,所以再次学习它的结构和原理。<br /> 用户中心服务器包含的模块有:<br /> 1.基本设置。时间设置,短消息设置。<br /> 2.注册设置。对email和用户名的设置。<br /> 3.邮件设置。发送人及发送方法。<br /> 4.应用管理。这是重点!!!!<br /> 应用包含有应用名,url地址,ip,通信密钥,应用类型,物理路径,个人资料,是否同步登录,是否接受通知等。<br /> 5.用户管理。基本的用户信息:头像,用户名,密码,邮件地址,注册日期,注册ip。<br /> 6.管理员。其实是拥有管理权的用记。<br /> 7.短消息模块。<br /> ...<br /> 以下有积分兑换,词语过滤,域名解析,数据备份,数据列表,更新缓存,插件等功能先略去,第一章我不想写太多。累人啊,哥们。<br /> <br /> <br /> <br /> <strong>注册:</strong></p> <p> <br /> 注册的地址是http://localhost/comsenz/bbs/member.php?mod=register,让我们来以这个地址为入口看代码。<br /> &lt;form action="member.php?mod=register" ... &lt;/form&gt;<br /> 可见注册后还是发回到member.php?mod=register,打开bbs\source\module\member\member_register.php这文件你会发现这样的代码:<br /> 1# $uid = uc_user_register($username, $password, $email, $questionid, $answer, $_G['clientip']);<br /> 它的定义是这样的:<br /> 2# define('UC_API_FUNC', UC_CONNECT == 'mysql' ? 'uc_api_mysql' : 'uc_api_post');<br /> 3# ......<br /> 4# function uc_user_register($username, $password, $email, $questionid = '', $answer = '', $regip = '') {<br /> 5# return call_user_func(UC_API_FUNC, 'user', 'register', array('username'=&gt;$username, 'password'=&gt;$password, 'email'=&gt;$email, 'questionid'=&gt;$questionid, 'answer'=&gt;$answer, 'regip' =&gt; $regip));<br /> 6# }<br /> 其中php系统函数call_user_func的定义的这样的:<br /> 7# mixed call_user_func ( callback $function [, mixed $parameter [, mixed $... ]] )<br /> 所以得知uc_api_mysql和uc_api_post是两个函数,用来负责和uc_server服务端程序通信的。定义如下<br /> 8# function uc_api_mysql($model, $action, $args=array()) { } 把$model和$action路由到uc_client/control/$model.php里面的方法on$action(){...}<br /> 所以我们根据5#找到uc_client/control/user.php里面的onregister方法。<br /> 9# function onregister() {<br /> 10# ...<br /> 11# $uid = $_ENV['user']-&gt;add_user($username, $password, $email, 0, $questionid, $answer, $regip);<br /> 12# return $uid;<br /> 13# }<br /> 其中$_ENV['user']是一个mode的变量,我一般是用到时才初始化变量的。这样就插入到了uc_server数据库里面了。<br /> <br /> <br /> 数据库注册方式就告一段落了,我们再来看一下用post通讯方式。<br /> 14# function uc_api_post($module, $action, $arg = array()) {<br /> 15# return uc_fopen2(UC_API.'/index.php', 500000, $postdata, '', TRUE, UC_IP, 20);<br /> 16# }<br /> 在15#中,程序向UC_API.'/index.php'发送数据,并把结果做为函数的返回值。其中UC_API的值是这样的:http://localhost/comsenz/ucenter<br /> uc_fopen用fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);发送数据,这是用到套接字发送方式,用http协议发送数据的。<br /> 发送时并附上cookie,uc_api_mysql则不用带cookie,此处的cookie大概是为了安全校验的,其实这里也可以用soap,curl的发送方式的。<br /> 它把$module和$action转换成m=$module&amp;a=$action这样的字符串做为$postdata发送。<br /> <br /> 我们再到uc_server看一下它是如何接收数据的。http://localhost/comsenz/ucenter/index.php是接收数据的入口。<br /> uc_server 根据接收到的 m和a(模块和动)转入到UC_ROOT.RELEASE_ROOT."control/$m.php的 on$action()方法内处理。<br /> 17# 找到function onregister() {<br /> ...<br /> 18# $uid = $_ENV['user']-&gt;add_user($username, $password, $email, 0, $questionid, $answer, $regip);<br /> 19@ }<br /> 在18#中,服务器端同样把数据插入到user表里面。<br /> <br /> 这样可以看出,无论是uc_api_mysql还是uc_api_post,都是要把数据插入到ucenter服务器的数据库内的。<br /> </p> <p> <br /> <strong>我们再来看同步登录:</strong><br /> 20# function onsynlogin() {<br /> ......<br /> 21# foreach($this-&gt;cache['apps'] as $appid =&gt; $app) {<br /> 22# $synstr .= '&lt;script type="text/javascript" src="'.$app['url'].'/api/uc.php?time='.$this-&gt;time.'&amp;code='.urlencode($this-&gt;authcode('action=synlogin&amp;username='.$this-&gt;user['username'].'&amp;uid='.$this-&gt;user['uid'].'&amp;password='.$this-&gt;user['password']."&amp;time=".$this-&gt;time, 'ENCODE', $app['authkey'])).'"&gt;&lt;/script&gt;'<br /> 23# }//end foreach<br /> 24# }<br /> 可以ucenter是用javascript的方式来通知应用同步登录的。也就是用&lt;script src="$url"&gt;&lt;/script&gt;这样的方式方问其它应用的登录通知接口,有几个应用就对应几个通知接口&lt;script &gt;的调用。<br /> <br /> 在api/uc.php中,我们可以看到,其它应用接收到通知,立即验证登录是否有效,如果有效,立即设置cookie以表示这个应用登录过了。<br /> function synlogin($get, $post) {<br /> ...<br /> $cookietime = 31536000;<br /> $uid = intval($get['uid']);<br /> $query = DB::query("SELECT uid, username, password FROM ".DB::table('common_member')." WHERE uid='$uid'");<br /> if($member = DB::fetch($query)) {<br /> dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);<br /> }<br /> }<br /> </p>

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