教学之友,学习之友。

站长教学网

当前位置: 站长教学网 > 开源代码 > cms教程 >

uc_client与ucenter之间的通信原理

时间:2012-12-17 09:10来源:未知 作者:ken 点击:

以用户登录为例介绍,其它注销,改密码,消息,头像,好友均类同。

 1.
 从用户xxx在某一应用程序的login.php,输入用户名,密码讲起。
 先用uc_user_login函数到uc server验证此用户和密码,如正确,则写入session,写入cookies,并更新应用程序会员表中的登录ip,登录时间。用户感觉不到这个过程。
 2.
 然后通过uc_user_synlogin通知uc server 用户xxx登录成功,这个过程可能使用ajax,用户感觉不到通知过程。
 3.
 uc server收到这个消息后,马上命令手下,把xxx登录的消息,像令牌环一样,发给所有愿意接收(后台中那个是否开启同步登录)这个消息的其它应用程序。其实就是带参数访问一下各应用程序的uc.php,用户感觉不到这个过程。
 4.
 各应用程序靠api下的uc.php来接收uc server发来的消息,并对uc server言听计从,让干什么就干什么。现在,收到让xxx用户在你的程序中登录的命令,马上执行。
 并写本应用程序的session,并且使用p3p, 写入相同域或不同域的cookies.   用户感觉不到这个过程。

 5.最后所有和uc整合的程序,xxx均登录成功。用户从www.eduyo.com/bbs登录后, 跳到www.eduyo.com/news同样显示登录。因为bbs 和news系统在后台均已登录。

 6.应用程序与uc server的会话结束。


 得益于uc设计的精巧过程,整个过程,用户完全感觉不到ucenter的存在.这是整合程序历史上的创新。

 以下为其中的一个例子:
 Supesite的uc_client和ucenter登录通信过程
 1、登录入口Index.php?action-login
//系统频道
if($_SGET['action'] != 'index') {    
if(empty($channels['menus'][$_SGET['action']]['upnameid']) && $channels['menus'][$_SGET['action']]['upnameid'] != 'news') {
 $scriptfile = S_ROOT.'./'.$_SGET['action'].'.php';
 } else {
 $scriptfile = S_ROOT.'./news.php';
 }
      //echo   $scriptfile;
if(file_exists($scriptfile)) {
 include_once($scriptfile);
 exit();
 }
 }
 登录控制器:Login.php
 登录视图:Site_login.html.php
    提交登录action:batch.login.php?action=login
 2、登录处理地址batch.login.php?action=login
 include_once(S_ROOT.'./uc_client/client.php');

 登录操作及其中涉及到的一些函数:站长教学网 eduyo.com
 $password = $_POST['password'];
 $username = $_POST['username'];
 去ucenter进行远程登录验证
 $ucresult = uc_user_login($username, $password, $loginfield == 'uid');

 如果登录成功
 则查本地用户信息
 如果有更新本地信息
 如果没有插入新的用户数据保持与ucenter进行同步

 然后同步其他子系统登录信息
 $msg = $lang['login_succeed'].uc_user_synlogin($members['uid']);

 function uc_user_synlogin($uid) {
 $uid = intval($uid);
 $return = uc_api_post('user', 'synlogin', array('uid'=>$uid));
return $return;
 }


 function uc_api_post($module, $action, $arg = array()) {
 $s = $sep = '';
 foreach($arg as $k => $v) {
 $k = urlencode($k);
if(is_array($v)) {
 $s2 = $sep2 = '';
 foreach($v as $k2 => $v2) {
 $k2 = urlencode($k2);
 $s2 .= "$sep2{$k}[$k2]=".urlencode(uc_stripslashes($v2));
 $sep2 = '&';
 }
 $s .= $sep.$s2;
 } else {
 $s .= "$sep$k=".urlencode(uc_stripslashes($v));
 }
 $sep = '&';
 }
 $postdata = uc_api_requestdata($module, $action, $s);

return uc_fopen2(UC_API.'/index.php', 500000, $postdata, '', TRUE, UC_IP, 20);
 }


 function uc_api_requestdata($module, $action, $arg='', $extra='') {
 $input = uc_api_input($arg);
 $post = "m=$module&a=$action&inajax=2&release=".UC_CLIENT_RELEASE."&input=$input&appid=".UC_APPID.$extra;
return $post;
 }

 function uc_api_url($module, $action, $arg='', $extra='') {
 $url = UC_API.'/index.php?'.uc_api_requestdata($module, $action, $arg, $extra);
return $url;
 }

 function uc_api_input($data) {
 $s = urlencode(uc_authcode($data.'&agent='.md5($_SERVER['HTTP_USER_AGENT'])."&time=".time(), 'ENCODE', UC_KEY));
return $s;
 }


 function uc_fopen2($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) {
 $__times__ = isset($_GET['__times__']) ? intval($_GET['__times__']) + 1 : 1;
if($__times__ > 2) {
return '';
 }
 $url .= (strpos($url, '?') === FALSE ? '?' : '&')."__times__=$__times__";
return uc_fopen($url, $limit, $post, $cookie, $bysocket, $ip, $timeout, $block);
 }

 function uc_fopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) {
 $return = '';
 $matches = parse_url($url);
 !isset($matches['host']) && $matches['host'] = '';
 !isset($matches['path']) && $matches['path'] = '';
 !isset($matches['query']) && $matches['query'] = '';
 !isset($matches['port']) && $matches['port'] = '';
 $host = $matches['host'];
 $path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/';
 $port = !empty($matches['port']) ? $matches['port'] : 80;
if($post) {
 $out = "POST $path HTTP/1.0\r\n";
 $out .= "Accept: **\r\n";
//$out .= "Referer: $boardurl\r\n";
 $out .= "Accept-Language: zh-cn\r\n";
 $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
 $out .= "Host: $host\r\n";
 $out .= "Connection: Close\r\n";
 $out .= "Cookie: $cookie\r\n\r\n";
 }
 $fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
if(!$fp) {
return '';//note $errstr : $errno \r\n
 } else {
 stream_set_blocking($fp, $block);
 stream_set_timeout($fp, $timeout);
 @fwrite($fp, $out);
 $status = stream_get_meta_data($fp);
if(!$status['timed_out']) {
while (!feof($fp)) {
if(($header = @fgets($fp)) && ($header == "\r\n" ||   $header == "\n")) {
break;
 }
 }

 $stop = false;
while(!feof($fp) && !$stop) {
 $data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
 $return .= $data;
if($limit) {
 $limit -= strlen($data);
 $stop = $limit <= 0;
 }
 }
 }
 @fclose($fp);
return $return;
 }
 }

 远程同步登录子系统操作之后
//显示信息
 function showmessage($message, $url_forward='', $second=3, $vars=array()) {
 global $_SGLOBAL, $_SCONFIG, $_SC, $channels;

if(empty($_SGLOBAL['inajax']) && $url_forward && empty($second)) {
//直接301跳转
 obclean();
 header("HTTP/1.1 301 Moved Permanently");
 header("Location: $url_forward");
 } else {
if(!defined('IN_SUPESITE_ADMINCP')) {
 $tpl_file = 'showmessage';
 $fullpath = 0;
 include_once(S_ROOT.'./language/message.lang.php');
if(!empty($mlang[$message])) $message = $mlang[$message];
 } else {
 $tpl_file = 'admin/tpl/showmessage.htm';
 $fullpath = 1;
 include_once(S_ROOT.'./language/admincp_message.lang.php');
if(!empty($amlang[$message])) $message = $amlang[$message];
 }

if(isset($_SGLOBAL['mlang'][$message])) $message = $_SGLOBAL['mlang'][$message];
 foreach ($vars as $key => $val) {
 $message = str_replace('{'.$key.'}', $val, $message);
 }
//显示
 obclean();
if(!empty($url_forward)) {
 $second = $second * 1000;
 $message .= "<script>setTimeout(\"window.location.href ='$url_forward';\", $second);</script><ajaxok>";
 }

 include template($tpl_file, $fullpath);
 ob_out();
 }
 exit();
 }

(责任编辑:ken)

TAG标签: Ucenter uc_client
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
注册登录:不允许匿名留言,登录后留言无需输入验证码。
栏目列表
最新内容