Discuz與Moodle實現同步登錄:
在moodle與ucenter通信成功的基礎上繼續講如何實現discuz與moodle同步登錄:
主要是修改login/index.php
思路分析:
Moodle系統嵌套此discuz論壇,因此以moodle用戶表爲主,先用身份驗證插件authenticate_user_login驗證用戶名與密碼是否正確,不正確顯示登錄無效,停留在登錄頁面;如果有該用戶存在,則用ucenter接口驗證用戶名,則uc_user_login驗證,如果有該用戶,則設置cookie,開啓同步登錄uc_user_synlogin,如果沒有該用戶,則向ucenter用戶表插入該用戶信息的一條記錄,成功後還是設置cookie,開啓同步登錄。
以下是實現代碼:
在驗證處加入:
if (empty($errormsg)) {
//先判斷moodle用戶名、密碼是否正確
$user = authenticate_user_login($frm->username, $frm->password);
if($user){
list($uid, $username, $password, $email) =uc_user_login($_POST['username'], $_POST['password']);
if($username) {
//ucenter表有此用戶,設置Cookie,登錄成功,並通知其它應用同步登錄
setcookie('Mdl_auth',uc_authcode($uid."\t".$username, 'ENCODE'));
//生成同步登錄的代碼
$ucsynlogin =uc_user_synlogin($uid);
echo$ucsynlogin.'<br><a href="'.$_SERVER['PHP_SELF'].'"></a>';
}else{
//ucenter用戶表無此用戶,應在ucenter用戶名中插入該用戶,設置Cookie,顯示登錄成功,並通知其它應用同步登錄
$conn=@mysql_connect("localhost","root","root");
mysql_select_db("discuz");
mysql_query("set namesutf8");
$username=$_POST['username'];
$regip=$_SERVER['REMOTE_ADDR'];
$regdate=time();
srand((double)microtime()*1000000);//生成隨機數種子
$ychar="0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
$list=explode(",",$ychar);
for($i=0;$i<6;$i++){
$randnum=rand(0,35); // 10+26;
$salt.=$list[$randnum];
}
//echo $salt;
$password=md5(md5($_POST['password']).$salt);
$sql="insert intocdb_uc_members(username,password,regip,regdate,salt) values('$username','$password','$regip','$regdate','$salt')";
$res=mysql_query($sql);
setcookie('Mdl_auth',uc_authcode($uid."\t".$username, 'ENCODE'));
//生成同步登錄的代碼
$ucsynlogin = uc_user_synlogin($uid);
echo $ucsynlogin.'<br><ahref="'.$_SERVER['PHP_SELF'].'"></a>';
}
}
}
然後在api/uc.php修改一下synlogin方法:
function synlogin($get, $post) {
$uid = $get['uid'];
$username = $get['username'];
if(!API_SYNLOGIN) {
returnAPI_RETURN_FORBIDDEN;
}
/*
require_once$this->appdir.'./forumdata/cache/cache_settings.php';
$cookietime = 2592000;
$discuz_auth_key =md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);
header('P3P: CP="CURaADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSPCOR"');
$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[password]\t$member[secques]\t$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);
}
//以上註釋掉的代碼是discuz的登錄cookies
*/
header('P3P: CP="CURaADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSPCOR"');
header("Location:../login/index.php?username=$username&uid=$uid");//同步登錄
_setcookie('example_auth',_authcode($uid."\t".$username, 'ENCODE',UC_KEY), 86500);
}