Discuz! 官方站

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 45371|回复: 38

uc应用同步登录分析

[复制链接]
发表于 2011-9-29 19:48:48 | 显示全部楼层 |阅读模式
本帖最后由 evenzhou 于 2011-9-29 19:49 编辑

在uc中如果安装了多个应用,那么同步登录问题是站长很关心的问题。下面我们来分析同步登录的过程

假设 uc中有 1一个discuz!x2论坛 和一个其它程序,通信都成功的状态下。怎么去排查同步登录的问题呢

首先,在discuz!登录的时候,程序会调用class_member.php类。
入口方式:member.php?mod=logging&action=login ,通过这个地址程序将进入function on_login()方法部分
然后查找$this->setting['allowsynlogin']  这是程序后台设置是否开启同步登录
这个方法中有两种情况判断登录问题 根据$_G['uid']
  1. if($_G['uid']) {
  2.                         $referer = dreferer();
  3.                         $ucsynlogin = $this->setting['allowsynlogin'] ? uc_user_synlogin($_G['uid']) : '';
  4.                         $param = array('username' => $_G['member']['username'], 'usergroup' => $_G['group']['grouptitle'], 'uid' => $_G['member']['uid']);
  5.                         showmessage('login_succeed', $referer ? $referer : './', $param, array('showdialog' => 1, 'locationtime' => true, 'extrajs' => $ucsynlogin));
  6.                 }
复制代码


从这里不难发现,uc_user_synlogin($_G['uid']) 处理的关键。打开: uc_client.php文件,
  1. function uc_user_synlogin($uid) {
  2.         $uid = intval($uid);
  3.         if(@include UC_ROOT.'./data/cache/apps.php') {
  4.                 if(count($_CACHE['apps']) > 1) {
  5.                         $return = uc_api_post('user', 'synlogin', array('uid'=>$uid));
  6.                 } else {
  7.                         $return = '';
  8.                 }
  9.         }
  10.         return $return;
  11. }
复制代码


此函数的作用就是与uc通信得到每个接口程序的要进行同步登录的处理字符串。是以js形式   类似这样一段代码:
这代码是从uc中返回。用来去访问接口
  1. <script type="text/javascript" src="http://localhost/x2817/api/uc.php?time=1317295440&code=be61At%2Be2gox280pg05HW%2FPd7vhIS3CX%2BPMBfh9f0X118Ezkvf6oeXEN8DAyK8fdptfz0WXONYikf2R61KW88tHd1YOzkqxaAew8YC5%2FVGcLPj4uX0KMpGUgUTqmZvAhk%2FrKqOQJylxdbvKy9suRNYznoRAeCeCAP%2BH3" reload="1"></script><script type="text/javascript" src="http://localhost/x151/api/uc.php?time=1317295440&code=b339OUklPx183hGdbeWCn9x%2FVXWj6CvzDh6C0R4WHqH3psEPXh82MgPZ6CewNnczDnuI51ccYdzX1AXQcQMoI%2F3yldiApHpGiFRd336yI%2FXda0bsn1vjzhqxWj8E0HodoC6%2BBU1TytX2q7nxeFNWT2MUzycZLjYN8h2W" reload="1"></script>
复制代码
得到这段代码之后,是怎么去运用的呢?又是在什么时候执行呢? 下面我们查看:(由于情况比较多,拿特殊情况来分析)
showmessage('login_succeed', $referer ? $referer : './', $param, array('showdialog' => 1, 'locationtime' => true, 'extrajs' => $ucsynlogin));
当用户登录成功,请在跳转的过程中,将会执行这段代码 这里的js关键是code部分,下面我们进入 接口部门假设应用的接口为: uc.php
  1. $code = @$_GET['code'];
  2.         parse_str(authcode($code, 'DECODE', UC_KEY), $get);

  3.         if(time() - $get['time'] > 3600) {
  4.                 exit('Authracation has expiried');
  5.         }
复制代码
将code解密,如果解密错误(请检查uc的密钥是否正确)。可以将得到的$get输出。调试方法:由于程序是用js在加载php文件所以直接断开输出是不会看到结果。可以将得到的结果输入到文件查看:
$get = var_export($get,true);
file_put_contents('test.txt',$get);
这样我们就能清楚的查看到code部分到底传入了什么

查看代码:
  1. if(in_array($get['action'], array('test', 'deleteuser', 'renameuser', 'gettag', 'synlogin', 'synlogout', 'updatepw', 'updatebadwords', 'updatehosts', 'updateapps', 'updateclient', 'updatecredit', 'getcredit', 'getcreditsettings', 'updatecreditsettings', 'addfeed'))) {
  2.                 $uc_note = new uc_note();
  3.                 echo $uc_note->$get['action']($get, $post);
  4.                 exit();
复制代码
就不难发现,程序是怎么执行登录。
如果应用程序没有正常登录:
首先判断,在class_member.php中 $ucsynlogin 是否返回了对应的js,如果返回了
接下来,查看是否进入到接口且正确解析code。然后查看是否执行了登录操作


同步退出过程类似同步登录。这里不做说明




发表于 2011-9-29 19:50:49 | 显示全部楼层
看了就顶!
回复

使用道具 举报

 楼主| 发表于 2011-9-29 20:08:55 | 显示全部楼层
用心等待 发表于 2011-9-29 19:50
看了就顶!

谢谢支持,
回复

使用道具 举报

发表于 2011-9-30 10:37:37 | 显示全部楼层
{:soso_e176:}  谢谢分享...至少明白了那么一点

http://www.42ba.com
回复

使用道具 举报

发表于 2011-9-30 11:21:57 | 显示全部楼层
谢谢分享,不过楼主可否检测下ecshop不同步退出的问题呢
回复

使用道具 举报

 楼主| 发表于 2011-9-30 14:50:40 | 显示全部楼层
菜鸟鸟 发表于 2011-9-30 11:21
谢谢分享,不过楼主可否检测下ecshop不同步退出的问题呢

都是什么版本的呢? 我本地搭建环境试试
回复

使用道具 举报

发表于 2011-9-30 16:00:21 | 显示全部楼层
evenzhou 发表于 2011-9-30 14:50
都是什么版本的呢? 我本地搭建环境试试

dz2.0 uc1.6 ec2.7.2
其实别的版本也是这样 这个问题很早就有人在论坛问了
ec论坛有个人说是ec api的问题
不错按照提供方法暂时未实现

症状就是dz的登录和退出信息无法同步到ec中 而ec到dz的都正常 ecmall一样
回复

使用道具 举报

发表于 2011-10-1 19:26:59 | 显示全部楼层
不大看得懂、慢慢升级到大牛。。
回复

使用道具 举报

发表于 2011-10-1 19:29:46 | 显示全部楼层
我看懂了,嘿嘿
回复

使用道具 举报

发表于 2011-10-1 19:47:58 | 显示全部楼层
再顶起来
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|Comsenz ( 粤B2-20090059-165 )star

GMT+8, 2019-10-16 12:28

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表