Discuz 用户登录机制分析
$discuz_auth_key的获得在common.inc.php文件中:
$discuz_auth_key = md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);
//1.$_DCACHE['settings']['authkey']是论坛安装时生成的15位随机数
//在common.inc.php中通过include文件导入:
//$cachelost = (@include DISCUZ_ROOT.'./forumdata/cache/cache_settings.php') ? '' : 'settings';
//2. $_SERVER["HTTP_USER_AGENT"]:记录用户浏览器相关信息的服务器端变量,例如:
//<?php echo $_SERVER["HTTP_USER_AGENT"]; ?>
//Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)). 获取$discuz_pw, $discuz_secques, $discuz_uid
list($discuz_pw, $discuz_secques, $discuz_uid) = empty($_DCOOKIE['auth']) ? array('', '', 0) : daddslashes(explode("\t", authcode($_DCOOKIE['auth'], 'DECODE')), 1);
//1. 通过$_DCOOKIE['auth']来获取这三个变量,而$_DCOOKIE['auth']是在用户登录的时候通过$discuz_auth_key加密写入的!
//2. $discuz_pw : 密码
//3. $discuz_secques : 密码提示问题
//4. $discuz_uid : 用户uid).auth信息的写入方式1: 在调用UC的client.php文件中uc_user_login完成登录请注意,discuz的client.php和UCenter提供的标准client.php不一致,多了一些内容:
//1.UCenter提供的内容:
function uc_user_register($username, $password, $email) {
return call_user_func(UC_API_FUNC, 'user', 'register', array('username'=>$username, 'password'=>$password, 'email'=>$email));
}
function uc_user_login($username, $password, $isuid=0) {
$isuid = intval($isuid);
$return = call_user_func(UC_API_FUNC, 'user', 'login', array('username'=>$username, 'password'=>$password, 'isuid'=>$isuid));
return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
}
//2.Discuz使用的内容:
function uc_user_register($username, $password, $email, $questionid = '', $answer = '') {
return call_user_func(UC_API_FUNC, 'user', 'register', array('username'=>$username, 'password'=>$password, 'email'=>$email, 'questionid'=>$questionid, 'answer'=>$answer));
}
function uc_user_login($username, $password, $isuid = 0, $checkques = 0, $questionid = '', $answer = '') {
$isuid = intval($isuid);
$return = call_user_func(UC_API_FUNC, 'user', 'login', array('username'=>$username, 'password'=>$password, 'isuid'=>$isuid, 'checkques'=>$checkques, 'questionid'=>$questionid, 'answer'=>$answer));
return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return);
}
//3.他们最终会调用到uc的control目录下的user.php,其中的一些onlogin等函数也有不同,可以借鉴一下Discuz的实现方式。
方式2: 在./api/uc.php的synlogin中完成的(被其他程序通过UCenter同步登录)
_setcookie('auth', _authcode("$member\t$member\t$member", 'ENCODE', $discuz_auth_key), $cookietime);
http://blog.sina.com.cn/s/blog_63426ff90100ieic.html 这个帖子不错,大家快来顶起来!捡代码论坛资源就是不错。
页:
[1]