如何实现phpcms和discuz的Cookie同步

清泛原创

===本文导读===

UCenter实现各系统通信的原理

整合phpcms v9和discuz X3.2实现同步登陆、退出免激活

===全文阅读===

如何实现phpcms和discuz的Cookie同步

前段时间在应用ucenter、discuz、phpcms等进行二次开发时遇到了在关闭浏览器时不能同步退出的问题,即ucenter默认是在同步登陆的时候其他的应用的cookie保存时间是864000(10天),所以当一个应用没有勾选直接登陆的时候,该应用在浏览器关闭的时候退出了,但是其他的还是仍旧没有退出。以下是个人的一些解决办法:


第一步:cookietime的传送
        先在配置文件里注册一个全局变量,用来保存cookietime,然后找到你所需要传送cookietime的应用目录下的uc_client的client.php文件,找到uc_user_synlogin函数,默认是

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

修改为

function uc_user_synlogin($uid) {
      require_once './include/common.inc.php';
      global $_CGLOBAL;
      $uid = intval($uid);
      $cookietime = $_CGLOBAL['cookietime'];
      $return = uc_api_post('user', 'synlogin', array('uid'=>$uid,'cookietime'=>$cookietime));
      return $return;
}


第二步:中转接受cookietime
       ucenter我们可以把他当成是中转站的功能,接受一个应用的数据,然后同步到各个应用当中。所以接下来找到ucenter/control目录下面user.php,注意不是应用的目录下面的user.php文件。找到onsynlogin函数。即:

function onsynlogin() {
      $this->init_input();
      $uid = $this->input('uid');
      if($this->app['synlogin']) {
            if($this->user = $_ENV['user']->get_user_by_uid($uid)) {
                  $synstr = '';
                  foreach($this->cache['apps'] as $appid => $app) {
                        if($app['synlogin'] && $app['appid'] != $this->app['appid']) {
                              $synstr .= '<script type="text/javascript" src="'.$app['url'].'/api/uc.php?time='.$this-                              >time.'&code='.urlencode($this->authcode('action=synlogin&username='.$this-         >user['username'].'&uid='.$this->user['uid'].'&password='.$this->user['password']."&time=".$this->time, 'ENCODE', $app['authkey'])).'" reload="1"></script>';
                        }
                  }
                  return $synstr;
            }
      }
      return '';
}

修改成

function onsynlogin() {
      $this->init_input();
      $uid = $this->input('uid');
      $cookietime = $this->input('cookietime');
      if($this->app['synlogin']) {
            if($this->user = $_ENV['user']->get_user_by_uid($uid)) {
                  $synstr = '';
                   foreach($this->cache['apps'] as $appid => $app) {
                        if($app['synlogin'] && $app['appid'] != $this->app['appid']) {
                              $synstr .= '<script type="text/javascript" src="'.$app['url'].'/api/uc.php?time='.$this->time.'&code='.urlencode($this->authcode('action=synlogin&username='.$this->user['username'].'&uid='.$this->user['uid'].'&cookietime='.$cookietime.'&password='.$this->user['password']."&time=".$this->time, 'ENCODE', $app['authkey'])).'" reload="1"></script>';
                        }
                  }
                  return $synstr;
            }
       }
      return '';
}

第三步:其他应用接受cookietime:

找到各个应用目录下面的api/uc.php文件,找到里面的function synlogin($get, $post)函数,将里面的cookietime定义变为$cookietime = $get['cookietime'];就可以了,这样一来就完成了$cookietime的在各应用之间的传递。


注意:如果接受cookie的应用是phpsso(如phpcms开启phpsso),它里面还有一层通信传递,还需要在 phpsso_server\api\uc.php  加cookietime。

phpcms discuz Cookie 同步

分享到:
评论加载中,请稍后...
创APP如搭积木 - 创意无限,梦想即时!
回到顶部