UC/Control/user.php中有一个onsynlogin方法
,这里就是处理同步登录的
。 functiononsynlogin(){
$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.='<scripttype="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。
$discuz_auth_key=md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);
header('P3P:CP="CURaADMaDEVaPSAoPSDoOURBUSUNIPURINTDEMSTAPRECOMNAVOTCNOIDSPCOR"');
$uid=intval($uid);
$query=$this->db->query("SELECTusername,uid,password,secquesFROM".$this->tablepre."membersWHEREuid='$uid'");
if($member=$this->db->fetch_array($query)){
_setcookie('sid','',-86400*365);
_setcookie('cookietime',$cookietime,31536000);
_setcookie('auth',_authcode("$member[password] $member[secques] $member[uid]",'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验证的应用来说,就实现了同步登录。