再逢山水 发表于 2013-1-25 03:40:24

Discuz中的同步登录

依附于Discuz UCenter的子应用都会有一个选项:

意思很明白了,那它是如何实现的呢?
UC/Control/user.php中有一个synlogin方法,这里就是处理同步登录的。

function synlogin() {         $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'])                     {                           //利用js模拟访问站点(页面),实现登录                        $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 '';       }
当调用该方法时,实际上会去调用该应用下api/uc.php文件,将用户名、密码及时间戳做为参数传递。
以上是实现的第一步。
第二步,当应用接收到UC的请求后,会调用uc_note类中的synlogin方法,该方法的核心是送一个P3P的HTTP头,然后种下COOKIE。

//生成dz认证密钥$discuz_auth_key = md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);         //发送p3p头信息      header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');         $uid = intval($uid);         $query = $this->db->query("SELECT username, uid, password, secques FROM ".$this->tablepre."members WHERE uid='$uid'");         if($member = $this->db->fetch_array($query)) {               _setcookie('sid', '', -86400 * 365);               _setcookie('cookietime', $cookietime, 31536000);               _setcookie('auth', _authcode("$member\t$member\t$member", 'ENCODE', $discuz_auth_key), $cookietime);         } else {               _setcookie('cookietime', $cookietime, 31536000);               _setcookie('loginuser', $username, $cookietime);               _setcookie('activationauth', _authcode($username, 'ENCODE', $discuz_auth_key), $cookietime);         }

对于Disucz这种基于COOKIE验证的应用来说,就实现了同步登录
页: [1]
查看完整版本: Discuz中的同步登录