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);
}