<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[沧海一粟]]></title> 
<link>http://www.dzhope.com/index.php</link> 
<description><![CDATA[Web系统架构与服务器运维,php开发]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[沧海一粟]]></copyright>
<item>
<link>http://www.dzhope.com/post//</link>
<title><![CDATA[Ucenter1.5 与自己开发的外部应用整合，无法同步登陆退出的问题]]></title> 
<author>jed &lt;jed521@163.com&gt;</author>
<category><![CDATA[代码编程]]></category>
<pubDate>Wed, 01 Apr 2009 01:59:12 +0000</pubDate> 
<guid>http://www.dzhope.com/post//</guid> 
<description>
<![CDATA[ 
	因为项目的需要，将ecshop2.6,discuz7,以及外部的自制页面应用全部整合到一个站内，要求以上所有位置登录一处，全站通行；一处退出，各处都退出；一处注册，全站有效。<br/><br/>实现这个目的，非Ucenter莫属了，于是下载Ucenter的最新版本1.5进行安装，然后在应用管理中逐个的添加ecshop2.6和discuz7.<br/><br/>以上通信全部成功,可实现ecshop和discuz中，同步登陆和同步退出。<br/><br/>注意到Ucenter1.5的文档里，自带一个examples（范例程序）,和我所需要的外部登录页面功能恰好吻合，于是先拿这个范例程序开刀。<br/><br/>调试中发现按照文档里的说明进行设置，无论如何，在ucenter的应用管理里也不能通信成功；<br/>于是进度卡在这里，其实我想告诉同样遇到这个问题的朋友，不必拘泥于非要看到“通信成功”这四个字，其实这里并不是问题的关键。<br/><br/>在example的config.inc.php中，缺少了一个变量：$database = ‘mysql’，这个变量在ucenter的客户端一会要用到，所以需要把这个变量填写进去；<br/>然后，在应用管理->你自己的应用->应用的物理路径填进去，注意这里只要填相对于uc的相对路径就可以，ucenter一会会自动转换为绝对路径；<br/>做完上面的两个步骤，你就可以看到通讯成功了。<br/><br/><br/>ucenter管理中应用管理通讯成功<br/>不过经测试发现，这里没有通信成功，但外部应用仍然是可以实现单向同步的，即在example中登录和退出，ecshop和discuz可以同步，而过程反过来，在后者登录或退出，在前者是无法同步的。<br/><br/>也就是说不能完全双向通讯的原因不在这里。<br/>打开example里的ucexample_1.php 20 - 25行<br/><br/><div class="code"><br/>if(!empty($_COOKIE&#91;&#039;Example_auth&#039;&#93;)) &#123;<br/>list($Example_uid, $Example_username) = explode(”&#92;t”, uc_authcode($_COOKIE&#91;&#039;Example_auth&#039;&#93;, ‘DECODE’));<br/>&#125; else &#123;<br/>$Example_uid = $Example_username = ”;<br/>&#125;<br/><br/></div><br/><br/>发现是根据$_COOKIE['Example_auth']判断用户登录与否；<br/>而这个cookie是在login_nodb.php中登录成功以后，才写进去的，查看同步登陆函数uc_user_synlogin，根本没有对这个cookie进行任何操作。很显然如果在其他应用中登录或退出，在这里是没有反应的。<br/>既然如此，我们就需要寻找其他的方法来判断用户是否在其他应用中登录。<br/><br/>注意到ucenter手册中表述同步登陆的原理为当在一个应用中登录后，逐个执行其他应用api/uc.php,<br/>在example的uc.php中，向文本文件输出cookies数组，观察一下。<br/>得到结果：<br/><br/><div class="code"><br/>uchome_loginuser=<br/>ECS=Array<br/>pma_cookie_username-1=nNh3UMjG6mnI/qK7mG1BgnK3F2/cw2t5<br/>pma_mcrypt_iv=75Ixuqb5dek=<br/>pma_lang=zh-utf-8<br/>pma_charset=iso-8859-1<br/>pma_collation_connection=utf8_general_ci<br/>htM_cookietime=2592000<br/>htM_onlineusernum=1<br/><br/></div><br/><br/>注意到uchome_loginuser值为空，如果这个值为登录用户的用户名，那就再理想不过了，可以使用discuz或ecshop的auth变量先判断用户登录与否，然后再得到用户名，所有问题就容易了。<br/>可惜这个变量无论怎么调都为空。<br/>因为ECS是一个数组，从名字来看，是ecshop所用的cookies数组，再对其进行输出后，真相就浮出水面了：<br/><br/><div class="code"><br/><br/>uchome_loginuser=<br/>ECS=Array<br/>visit_times=53<br/>username=lboyuan<br/>user_id=5<br/>email=lboyuan1@yahoo.com.cn<br/>password=f379eaf3c831b04de153469d1bec345e<br/>pma_cookie_username-1=nNh3UMjG6mnI/qK7mG1BgnK3F2/cw2t5<br/>pma_mcrypt_iv=75Ixuqb5dek=<br/>pma_lang=zh-utf-8<br/>pma_charset=iso-8859-1<br/>pma_collation_connection=utf8_general_ci<br/>htM_cookietime=2592000<br/>htM_onlineusernum=1<br/><br/></div><br/><br/>我们看到，在ECS这个数组中，以明文的方式分别存储着用户名和用户id等信息，只要读取这个数组，遍可以从全站范围得到登录用户的id,不过前提是各个应用cookies的作用域都设为全站范围。<br/><br/>对ucexample_1.php进行如下修改：<br/><br/><div class="code"><br/>if(empty($_COOKIE&#91;&#039;htM_auth&#039;&#93;))<br/>&#123;<br/>$Example_username= ”;<br/>&#125;<br/>else&#123;<br/>$Example_username=$_COOKIE&#91;&#039;ECS&#039;&#93;&#91;&#039;username&#039;&#93;;<br/>&#125;<br/><br/></div><br/><br/>其中$_COOKIE['htM_auth']为discuz中的登录cookies,由于在discuz中退出后，$_COOKIE['ECS']['username']的值并不消失，所以，只好用$_COOKIE['htM_auth']来判断登录状态，然后再读取用户名。<br/>通过以上的分析，说明comsenz在对比较综合的应用集成还是有所保留的<br/><br/><br/>Tags - <a href="http://www.dzhope.com/tags/ucenter/" rel="tag">ucenter</a> , <a href="http://www.dzhope.com/tags/%25E5%2590%258C%25E6%25AD%25A5%25E7%2599%25BB%25E5%25BD%2595/" rel="tag">同步登录</a>
]]>
</description>
</item><item>
<link>http://www.dzhope.com/post//#blogcomment</link>
<title><![CDATA[[评论] Ucenter1.5 与自己开发的外部应用整合，无法同步登陆退出的问题]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.dzhope.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>