ucenter1.5通讯过程分析 - UCH插件 - 三路友社论坛 娱乐交友社区论坛 - SNS
返回列表 回复 发帖

ucenter1.5通讯过程分析

本帖最后由 trueman 于 2010-3-12 16:38 编辑

1,用户登录bbs,通过logging.php文件中,使用函数uc_user_login验证,如果验证成功,将调用函数uc_user_synlogin(位于uc_client下的client.php文件中),在这个函数中调用 uc_api_post('user', 'synlogin', array('uid'=>$uid));之后向UC_API.'/index.php'传递了数据;这里的UC_API就是在config.inc.php中的定义的uc_server之URL地址
2,uc_server的index.php接受参数数据,获得model为user,action为synlogin,就调用control目录下的user.php类中的onsynlogin方法,通过foreach循环,以javascript的方式通知uc应用列表中的应用同步登录;即通过get方式传递给应用目录中api下的uc.php一些数据;
3,uc.php接收通知并处理get过来的数据,并在函数synlogin(位于uc.php中)通过函数_authcode加密数据(默认以UC_KEY作为密钥),用函数_setcookie设置cookie;
4,各个应用在适当的文件中用对应的密钥解码上面设置的cookie,得到用户id等数据;通过这个值来判断用户是否经过其它应用登录过;

-------------------------------------------------------------------------------------------------------
不同的应用加密的函数名称可能不同,但密钥相同情况下,加密结果是一样的:
uc.php里是_authcode,
client.php里是uc_authcode,
\bbs\include\global.func.php里是authcode
uchome\source\function_common.php里是authcode
supersite\function\common.func.php里是authcode

------------------------------------------------------------------------------------------------------

以discuz举例:
一、用户登录检查与用户登录验证logging.php
在bbs的logging.php中如下代码段
} elseif($action == 'login') {
if($discuz_uid) {
   $ucsynlogin = '';
   showmessage('login_succeed', $indexname);
}

检查用户id变量$discuz_uid是否为空来判断,用户是否登录(包括从别的应用登录。)
如果用户从bbs登录,则在登录验证成功后通过如下代码:
$ucsynlogin = $allowsynlogin ? uc_user_synlogin($discuz_uid) : '';
通知其它应用----“用户已从bbs登录,请通知其它应用设置cookie”
(uc_server通过javascript调用方式向其它应用的api/uc.php传递数据)
可以在uc应用目录下新建一个名为test.php的文件,来模拟登录成功,请求uc_server通知其它应用。文件内容为:
---------------------文件内容开始----------------------
<?php
include_once "config.inc.php";
include_once "./uc_client/client.php";
echo uc_user_synlogin(1);
echo "<pre>";
var_dump($_COOKIE);
echo "</pre>";

?>

<script type="text/javascript">
var obj=document.getElementsByTagName("script");
for(var i=0;i<obj.length-1;i++) {
   document.write("<a href=\""+obj.src+"\">"+obj.src+"</a><hr>");
}
</script>

---------------------文件内容结束----------------------
ps:这段测试代码还可以测试同步登录不好使的情况,具体使用方法,你可以思考一下(本文后面也有介绍),有问题可以在此文结尾发表评论与我讨论
运行后,查看源代码即可看到javascript;
这里要注意了:这些javascript的通知中是不包含用户登录的应用的。也就是说只"通知"用户未登录的应用,因为用户通过uc_server登录成功的当前应用,当然不需要uc_server再通知了。具体代码请参看:webroot\uc_server\control\user.php中的onsynlogin函数的这句:
if($app['synlogin'] && $app['appid'] != $this->app['appid'])
代码解释:
$app['synlogin']是uc应用是否允许同步登录
而且应用id不等于用户当前登录的应用id
$app数组就是uc_server\data\cache\apps.php中的数组$_CACHE['apps'];
$this->app就是用户登录的应用
二、接受其它应用的同步登录通知:
在discuz的api目录下的uc.php中的函数synlogin,在这里接受uc_server发送过来的“同步登录通知”,并设置discuz的cookie,在这个函数中你可以查看到cookie的加密密钥的“算法”;
如果你想看看uc_server发送过的的“通知”是什么数据,你可以这么做:
1,修改要接受通知的应用目录下的api\uc.php,在$action = $get['action'];代码下面添加如下代码:
echo "<pre>";var_dump($get);echo "</pre>";die("<hr>api\uc.php");
2,将上面建立的test.php文件放置在其它允许同步登录的应用目录下,并在浏览器中运行,然后点击页面中对应第一步的应用链接,即可看到uc_server“通知”给该应用的数据;
---------------------------分割线-------------------------------
function synlogin($get, $post)
在这个函数中通过_authcode函数,以密钥$discuz_auth_key加密了cookie;
在这里为了避免cookie名称冲突,在cookie名称(一般为:auth)前加了前缀($cookiepre),这个前缀也就是在config.inc.php中设置的那个cookie前缀值;
请看设置cookie的函数_setcookie:
(通过参数$prefix来判断是否对cookie名称添加前缀$cookiepre)
function _setcookie($var, $value, $life = 0, $prefix = 1) {
global $cookiepre, $cookiedomain, $cookiepath, $timestamp, $_SERVER;
setcookie(($prefix ? $cookiepre : '').$var, $value,
  $life ? $timestamp + $life : 0, $cookiepath,
   $cookiedomain, $_SERVER['SERVER_PORT'] == 443 ? 1 : 0);
}

密钥“算法”:
$discuz_auth_key= md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);
也就是不同用户加密cookie的密钥可能不同;
三、检查用户是否已登录(无论是那个应用下登录):
discuz的include目录中common.inc.php中有这样的代码:

$discuz_auth_key = md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);
list($discuz_pw, $discuz_secques, $discuz_uid) = empty($_DCOOKIE['auth']) ? array('', '', 0) : daddslashes(explode("\t", authcode($_DCOOKIE['auth'], 'DECODE')), 1);

这段代码就是解码在uc.php中用密钥($discuz_auth_key)加密的cookie值,以获得用户id($discuz_uid)
这里的解密函数位于bbs\include\global.func.php中,虽然未给函数传递cookie密钥,但函数中通过全局变量$GLOBALS['discuz_auth_key'])获得密钥。
------------------------------------------------------------------------------
结束语:
感谢你花时间读到了这里,还烦劳您在页面下方发表一下评论,说说你对这篇文章的看法。欢迎大家与我讨论此话题。

原帖地址:http://hi.baidu.com/winterfog/blog/item/31dd3908c180709d0b7b8208.html
学历证书
真实上网学历证书  为你腾飞大学梦想!
网上终身有效    让你梦想学历证书成真!
网址:http://www.yyjy8.com
本公司专业办理全国各地院校的专科和本科学历证书,学历认证。
欢迎新老客户咨询办理。本公司诚信为本  信誉第一
咨询客服QQ:1459628788
电话:13651186558
联系人:李老师
真实上网学历证书 拥有到处都灵 终身永久可查 保你有用之才
金沙娱乐城爲亞洲著名博彩公司,具有多年業界經驗的經營人員及雄厚的實力背景,有超過10年的博彩市場運營經驗。公司從2005年起在菲律賓持照合法經營博彩,如今已經發展成集賭場、酒店、博彩、休閑、餐飲爲一體的大型娛樂集團。賭場客服總部設在菲律賓,馬來西亞、澳門、韓國、加拿大、新加坡均設有分部。中国赌城公司在娛樂企業中,也成爲球最受歡迎的娛樂賭場之一。
從2005年開始,公司致力于爲用戶提供更專業的棋牌類網上服務,爲更多的棋牌愛好者提供更方便更周到的娛樂投注。配備操作簡易的網上投注系統,啤酒樂園、開心天地現場視頻遊戲,高標准的安全防護,讓客戶更放心的交易。客戶的滿意,就是我們經營的一貫目標!
以客爲尊,全方位服務于玩家!公司投入大量的資金、技術和人力,運用先進的高端技術和設備,將一個真實的賭場完全呈現在玩家面前。

登陆界面:  主站: www.bc175.com  备站: www.bc175.net



真人真钱斗地主界面:


棋牌游戏平台提供: 金沙斗地金沙扎金花金沙二人梭哈金沙五人梭哈金沙大话骰 金沙3D轮盘 金沙开心天地 金沙啤酒乐园真钱游戏 金沙棋牌 金沙娱乐城
易发棋牌,作为09年末潮流服饰的新生力军,天使真爱从品牌建立初期就力拔头筹。品牌造势上,邀请国内知名广告代言新宠初千惠入主。产品开发上,力邀国内外顶级设计师,为打造自主原创品牌打下坚实基础。市场方面,更是推出了88元体零利润体验价、10万豪礼赠送等活动。在营销渠道上,选择了国内最大的网络电子商务平台淘宝网。
      对于初期品牌的营销理念,天使真爱(广州)总裁冯军有着独到的见解:作为以流行、时尚、潮流为基础的原创型品牌。我们认为,天使真爱虽然在初期一系列的代言、产品开发到产品体验上。都做出了较高的姿态,原因在于我们希望向消费者传递一个亲切、感性、以消费者为中心的印象。当然,作为新品牌,我们非常清楚天使真爱这个品牌,还是一个孩子。所以从一开始我们就以提高产品的用户体验、以消费者为中心的品牌理念贯穿我们的营销模式。据悉,在短短的一个月的淘宝战略中。天使真爱创造了零投诉、百分百好评的记录。充分的体现了新品牌、大姿态、零距离的品牌魅力。
真钱扎金花,真钱斗地主
名仕棋牌

扎金花】【斗地主】【港式五张
名仕棋牌新开张,时间证明我们是最专业,最实力,最信誉的
注册地址:
http://www.msqp.biz 最新活动:
1.注册送10元,满15即可兑换!所有提款在5分钟内处理,工商银行全周全天即时到账,其他银行到账时间为1到2小时,周六周日除外
2.名仕国际充值30元可参加抽奖活动,此外充值100元赠送5元另外有三次抽奖机会;所有抽奖活动奖金金额为1元至888元,百分百中奖!
3.即日起,所有名仕的玩家每天都有机会获得88元现金大奖!我们将在每日晚12时随机抽取5位幸运玩家,赠送88元现金大奖!游戏大厅可查看中奖名单
4.边玩游戏边中奖,在任意房间玩满50局即可参加抽奖,100%中奖
注册地址:
http://www.msqp.biz  

合作咨询QQ: 982199037
返回列表