Ucenter1.5 与自己开发的外部应用整合,无法同步登陆退出的问题 不指定

jed , 2009-4-1 09:59 , 代码编程 , 评论(0) , 阅读(5747) , Via 本站原创 | |
因为项目的需要,将ecshop2.6,discuz7,以及外部的自制页面应用全部整合到一个站内,要求以上所有位置登录一处,全站通行;一处退出,各处都退出;一处注册,全站有效。

实现这个目的,非Ucenter莫属了,于是下载Ucenter的最新版本1.5进行安装,然后在应用管理中逐个的添加ecshop2.6和discuz7.

以上通信全部成功,可实现ecshop和discuz中,同步登陆和同步退出。

注意到Ucenter1.5的文档里,自带一个examples(范例程序),和我所需要的外部登录页面功能恰好吻合,于是先拿这个范例程序开刀。

调试中发现按照文档里的说明进行设置,无论如何,在ucenter的应用管理里也不能通信成功;
于是进度卡在这里,其实我想告诉同样遇到这个问题的朋友,不必拘泥于非要看到“通信成功”这四个字,其实这里并不是问题的关键。

在example的config.inc.php中,缺少了一个变量:$database = ‘mysql’,这个变量在ucenter的客户端一会要用到,所以需要把这个变量填写进去;
然后,在应用管理->你自己的应用->应用的物理路径填进去,注意这里只要填相对于uc的相对路径就可以,ucenter一会会自动转换为绝对路径;
做完上面的两个步骤,你就可以看到通讯成功了。


ucenter管理中应用管理通讯成功
不过经测试发现,这里没有通信成功,但外部应用仍然是可以实现单向同步的,即在example中登录和退出,ecshop和discuz可以同步,而过程反过来,在后者登录或退出,在前者是无法同步的。

也就是说不能完全双向通讯的原因不在这里。
打开example里的ucexample_1.php 20 - 25行


if(!empty($_COOKIE['Example_auth'])) {
list($Example_uid, $Example_username) = explode(”\t”, uc_authcode($_COOKIE['Example_auth'], ‘DECODE’));
} else {
$Example_uid = $Example_username = ”;
}



发现是根据$_COOKIE['Example_auth']判断用户登录与否;
而这个cookie是在login_nodb.php中登录成功以后,才写进去的,查看同步登陆函数uc_user_synlogin,根本没有对这个cookie进行任何操作。很显然如果在其他应用中登录或退出,在这里是没有反应的。
既然如此,我们就需要寻找其他的方法来判断用户是否在其他应用中登录。

注意到ucenter手册中表述同步登陆的原理为当在一个应用中登录后,逐个执行其他应用api/uc.php,
在example的uc.php中,向文本文件输出cookies数组,观察一下。
得到结果:


uchome_loginuser=
ECS=Array
pma_cookie_username-1=nNh3UMjG6mnI/qK7mG1BgnK3F2/cw2t5
pma_mcrypt_iv=75Ixuqb5dek=
pma_lang=zh-utf-8
pma_charset=iso-8859-1
pma_collation_connection=utf8_general_ci
htM_cookietime=2592000
htM_onlineusernum=1



注意到uchome_loginuser值为空,如果这个值为登录用户的用户名,那就再理想不过了,可以使用discuz或ecshop的auth变量先判断用户登录与否,然后再得到用户名,所有问题就容易了。
可惜这个变量无论怎么调都为空。
因为ECS是一个数组,从名字来看,是ecshop所用的cookies数组,再对其进行输出后,真相就浮出水面了:



uchome_loginuser=
ECS=Array
visit_times=53
username=lboyuan
user_id=5
email=lboyuan1@yahoo.com.cn
password=f379eaf3c831b04de153469d1bec345e
pma_cookie_username-1=nNh3UMjG6mnI/qK7mG1BgnK3F2/cw2t5
pma_mcrypt_iv=75Ixuqb5dek=
pma_lang=zh-utf-8
pma_charset=iso-8859-1
pma_collation_connection=utf8_general_ci
htM_cookietime=2592000
htM_onlineusernum=1



我们看到,在ECS这个数组中,以明文的方式分别存储着用户名和用户id等信息,只要读取这个数组,遍可以从全站范围得到登录用户的id,不过前提是各个应用cookies的作用域都设为全站范围。

对ucexample_1.php进行如下修改:


if(empty($_COOKIE['htM_auth']))
{
$Example_username= ”;
}
else{
$Example_username=$_COOKIE['ECS']['username'];
}



其中$_COOKIE['htM_auth']为discuz中的登录cookies,由于在discuz中退出后,$_COOKIE['ECS']['username']的值并不消失,所以,只好用$_COOKIE['htM_auth']来判断登录状态,然后再读取用户名。
通过以上的分析,说明comsenz在对比较综合的应用集成还是有所保留的

发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]