admin 发表于 2016-12-23 15:41:37

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

kaneki880914 发表于 2017-1-6 06:51:23

这个帖子不错,大家快来顶起来!捡代码论坛资源就是不错。
页: [1]
查看完整版本: Discuz 用户登录机制分析