你现在的位置:首页 > PHP网站建设知识库 > UCenter Home > 正文

为UCenter、UChome增加邮箱地址登录功能

很多使用UCenter作为用户账户管理中心的朋友想要让其支持邮箱登录,一些uchome开发甚至自己去写了很多代码来实现这个功能。其实没有那么麻烦,要支持邮箱登录只需对你的应用做一点小小的改动就可以了。

注意:要使用邮箱登录功能的话,建议你在UCenter后台管理中设置不允许重复的邮箱地址!

因为UCenter客户端API中本身就支持邮箱登录,只是应用项目不支持这种方式的调用。

我们来看一下API中的登录函数uc_user_login,下面是官方给出的函数说明

array uc_user_login(
    string username ,//用户ID、用户名、用户邮箱都是它
    string password [,//密码
    bool isuid ,//1表示使用ID登录,0表示使用用户名登录(默认)
    bool checkques ,//1表示要验证安全问题,0表示不验证(默认)
    integer questionid ,//安全提问索引
    string answer]//安全提问答案
)

注意isuid 参数,官方没有提到,其实还可以使用另一个值'2',表示使用邮箱地址登录。

由此我们就有办法在应用中增加邮箱登录的功能了!

拿UChome来说,如果你是使用post远程API通信,只需修改/source/function_common.php文件
找到getpassport($username, $password)函数,加入一点用户名是否为邮箱的判断,代码如下

//获取用户数据
function getpassport($username, $password) {
    global $_SGLOBAL, $_SC;

    $passport = array();
    if (!@include_once S_ROOT . './uc_client/client.php') {
        showmessage('system_error');
    }
    //判断是否是邮箱
    if(strpos($username, '@')) $isuid = 2;
    else $isuid = 0;
    $ucresult = uc_user_login($username, $password, $isuid);
    if ($ucresult[0] > 0) {
        $passport['uid'] = $ucresult[0];
        $passport['username'] = $ucresult[1];
        $passport['email'] = $ucresult[3];
    }
    return $passport;
}


如果你是使用mysql API的方式,则还要修改两个地方
一是UChome目录下的客户端API:/uc_client/control/user.php的onlogin()函数,如下

    //note public 外部接口 登陆接口
    function onlogin() {
        $this->init_input();
        $isuid = $this->input('isuid');
        $username = $this->input('username');
        $password = $this->input('password');
        $checkques = $this->input('checkques');
        $questionid = $this->input('questionid');
        $answer = $this->input('answer');
        if($isuid == 1) {
            $user = $_ENV['user']->get_user_by_uid($username);
        } elseif($isuid == 2) {//邮箱登录功能在这里哦
            $user = $_ENV['user']->get_user_by_email($username);
        } else {
            $user = $_ENV['user']->get_user_by_username($username);
        }

        $passwordmd5 = preg_match('/^\w{32}$/', $password) ? $password : md5($password);
        //note 用户名不存在
        if(empty($user)) {
            $status = -1;
        } elseif($user['password'] != md5($passwordmd5.$user['salt'])) {
            $status = -2;
        } elseif($checkques && $user['secques'] != '' && $user['secques'] != $_ENV['user']->quescrypt($questionid, $answer)) {
            $status = -3;
        } else {
            $status = $user['uid'];
        }
        $merge = $status != -1 && !$isuid && $_ENV['user']->check_mergeuser($username) ? 1 : 0;
        return array($status, $user['username'], $password, $user['email'], $merge);
    }


二是UChome目录下的客户端API /uc_client/model/user.php ,增加一个邮箱登录的函数,这个函数是从UCenter\model\user.php中抄过来的。

    function get_user_by_email($email) {
        $arr = $this->db->fetch_first("SELECT * FROM ".UC_DBTABLEPRE."members WHERE email='$email'");
        return $arr;
    }

按照这种方法,给予UCenter的其他应用项目都可以支持邮箱登录了