ucenter整合shopnc、tipask、dedecms 实现单点注册登录

1.ucenter介绍


UCenter是Comsenz旗下各个产品之间信息直接传递的一个桥梁,通过UCenter 站长可以无缝整合Comsenz系列产品,实现用户的一站式登录以及社区其他数据的交互。当然可以整合任意程序,只要自己实现接入。

http模式下,同步登陆流程如下:

web1 用client.php中的uc_user_login()去ucenter验证登陆,完成后--->

调用uc_user_synlogin()--->uc_api_post()发送到ucenter下control/user.php的onsynlogin()接口--->

返回 字符串(如下同步登陆参数)----->

通过web1将"; exit(); }

/**
     * 登录操作
     *
     */
    public function indexOp(){
        Language::read("home_login_index,home_login_register");
        $lang   = Language::getLangContent();
        $model_member   = Model('member');
        //检查登录状态
        $model_member->checkloginMember();
        if ($_GET['inajax'] == 1 && C('captcha_status_login') == '1'){
            $script = "document.getElementById('codeimage').src='index.php?act=seccode&op=makecode&nchash=".getNchash()."&t=' + Math.random();";
        }
        $result = chksubmit(false,C('captcha_status_login'),'num');
        if ($result !== false){
            if ($result === -11){
                showDialog($lang['login_index_login_illegal'],'','error',$script);
            }elseif ($result === -12){
                showDialog($lang['login_index_wrong_checkcode'],'','error',$script);
            }
            
            $login_info = array();
            $login_info['user_name'] = $_POST['user_name'];
            $login_info['password'] = $_POST['password'];
          
            if(include_once BASE_ROOT_PATH.'/uc_client/client.php')
            {
                $ucenter_user = uc_get_user($login_info['user_name']);
               
                if ($ucenter_user){ //ucenter有数据 又没同步到 注册
                    
                    $check_member_name  = $model_member->getMemberInfo(array('member_name'=>$login_info['user_name']));
                    if(!$check_member_name)
                    {
                        $register_info = array();
                        $register_info['username'] = $_POST['user_name'];
                        $register_info['password'] = $_POST['password'];
                        $register_info['password_confirm'] = $_POST['password'];
                        $register_info['email'] = $ucenter_user[2];
                        
                        $member_info = $model_member->register($register_info);
                        
                        if($member_info)
                        {
                            list($uid, $username, $password, $email) = uc_user_login($login_info['user_name'],  $login_info['password']);
                            $ucsynlogin = uc_user_synlogin($uid);
                        }else
                        {
                            showDialog('中心同步用户失败','','error');
                        }
                        
                    }else
                    {
                        list($uid, $username, $password, $email) = uc_user_login($login_info['user_name'],  $login_info['password']);
                        $ucsynlogin = uc_user_synlogin($uid);
                    }
                    
                    
                }
                
            }
            
            
            $member_info = $model_member->login($login_info);
            if(isset($member_info['error'])) {
                showDialog($member_info['error'],'','error',$script);
            }
            
            
            // 自动登录
            $member_info['auto_login'] = $_POST['auto_login'];
            $model_member->createSession($member_info, true);
            
            
                
            if($_POST['is_distri_login'] == 'yes' && in_array($member_info['distri_state'],array('0'))){
                
                redirect_new(urlDistribute('distri_join','index'), $ucsynlogin);
            }
            if ($_GET['inajax'] == 1){
                showDialog('',$_POST['ref_url'] == '' ? 'reload' : $_POST['ref_url'],'js', $ucsynlogin);
            } else {
                redirect_new($_POST['ref_url'], $ucsynlogin);
            }
        }else{
             
            //登录表单页面
            $_pic = @unserialize(C('login_pic'));
            if ($_pic[0] != ''){
                Tpl::output('lpic',UPLOAD_SITE_URL_HTTPS.'/'.ATTACH_LOGIN.'/'.$_pic[array_rand($_pic)]);
            }else{
                Tpl::output('lpic',UPLOAD_SITE_URL_HTTPS.'/'.ATTACH_LOGIN.'/'.rand(1,4).'.jpg');
            }

            if(empty($_GET['ref_url'])) {
                $ref_url = getReferer();
                if (!preg_match('/act=login&op=logout/', $ref_url)) {
                 $_GET['ref_url'] = $ref_url;
                }
            }
            Tpl::output('html_title',C('site_name').' - '.$lang['login_index_login']);
            if ($_GET['inajax'] == 1){
                Tpl::showpage('login_inajax','null_layout');
            }else{
                Tpl::showpage('login');
            }
        }
    }

    /**
     * 退出操作
     *
     * @param int $id 记录ID
     * @return array $rs_row 返回数组形式的查询结果
     */
    public function logoutOp(){
        Language::read("home_login_index");
        $lang   = Language::getLangContent();
        
        if(include_once BASE_ROOT_PATH.'/uc_client/client.php')
        {
            $ucsynlogout = uc_user_synlogout();
        }
        
        // 清理COOKIE
        setNcCookie('msgnewnum'.$_SESSION['member_id'],'',-3600);
        setNcCookie('auto_login', '', -3600);
        setNcCookie('cart_goods_num','',-3600);
        session_unset();
        session_destroy();
        if(empty($_GET['ref_url'])){
            $ref_url = getReferer();
        }else {
            $ref_url = $_GET['ref_url'];
        }
        redirect_new(LOGIN_SITE_URL . '/index.php?act=login&ref_url='.urlencode($ref_url), $ucsynlogout);
    }

    /**
     * 会员注册页面
     *
     * @param
     * @return
     */
    public function registerOp() {
        Language::read("home_login_register");
        $lang   = Language::getLangContent();
        $model_member   = Model('member');
        $model_member->checkloginMember();
        Tpl::output('html_title',C('site_name').' - '.$lang['login_register_join_us']);
        Tpl::showpage('register');
    }

    /**
     * 会员添加操作
     *
     * @param
     * @return
     */
    public function usersaveOp() {
        Language::read("home_login_register");
        $lang   = Language::getLangContent();
        $model_member   = Model('member');
        $model_member->checkloginMember();
        $result = chksubmit(true,C('captcha_status_register'),'num');
        if ($result){
            if ($result === -11){
                showDialog($lang['invalid_request'],'','error');
            }elseif ($result === -12){
                showDialog($lang['login_usersave_wrong_code'],'','error');
            }
        } else {
            showDialog($lang['invalid_request'],'','error');
        }
        $register_info = array();
        $register_info['username'] = $_POST['user_name'];
        $register_info['password'] = $_POST['password'];
        $register_info['password_confirm'] = $_POST['password_confirm'];
        $register_info['email'] = $_POST['email'];
        
        if(include_once BASE_ROOT_PATH.'/uc_client/client.php')
        {
            $activeuser = uc_get_user($register_info['username']);
            if ($activeuser) {
                showDialog("该用户无需注册,请直接登录",'','error');
            }
           
            $uid = uc_user_register($register_info['username'], $register_info['password'], $register_info['email']);
          
            if($uid <= 0)
            {
                if($uid == -1)
                {
                    showDialog("用户名不合法!",'','error');
                    exit();
                }
                elseif($uid == -2)
                {
                    showDialog("包含要允许注册的词语!",'','error');
                    exit();
                }
                elseif($uid == -3)
                {
                    showDialog("你指定的用户名 {$userid} 已存在,请使用别的用户名!",'','error');
                    exit();
                }
                elseif($uid == -5)
                {
                    showDialog("你使用的Email 不允许注册!",'','error');
                    exit();
                }
                elseif($uid == -6)
                {
                    showDialog("你使用的Email已经被另一帐号注册,请使其它帐号",'','error');
                    exit();
                }
                else
                {
                    showDialog("注删失改!",'','error');
                    exit();
                }
            }
            else
            {
                $ucsynlogin = uc_user_synlogin($uid);
            }
        }
       
        $member_info = $model_member->register($register_info);
        
        if(!isset($member_info['error'])) {
            $model_member->createSession($member_info, true);

            $_POST['ref_url']   = (strstr($_POST['ref_url'],'logout')=== false && !empty($_POST['ref_url']) ? $_POST['ref_url'] : urlMember('member_information', 'member'));
            if ($_GET['inajax'] == 1){
                showDialog('',$_POST['ref_url'] == '' ? 'reload' : $_POST['ref_url'],'js', $ucsynlogin);
            } else {
                redirect_new($_POST['ref_url'],$ucsynlogin);
            }
        } else {
            showDialog($member_info['error']);
        }
    }

整合完毕后,会出现个问题,shopnc注册其他两个站点需要先登录一次后才能同步,原因是注册仅仅是把用户数据注册到ucenter用户表中,没有把用户数据注册到各自所属用户表中。问题找到了,如下代码


解决方案:

uc_client/model/user.php 修改

function add_user($username, $password, $email, $uid = 0, $questionid = '', $answer = '', $regip = '') {
	   
        $oldp = $password;
		$regip = empty($regip) ? $this->base->onlineip : $regip;
		$salt = substr(uniqid(rand()), -6);
		$password = md5(md5($password).$salt);
		$sqladd = $uid ? "uid='".intval($uid)."'," : '';
		$sqladd .= $questionid > 0 ? " secques='".$this->quescrypt($questionid, $answer)."'," : " secques='',";
		$this->db->query("INSERT INTO ".UC_DBTABLEPRE."members SET $sqladd username='$username', password='$password', email='$email', regip='$regip', regdate='".$this->base->time."', salt='$salt'");
		$uid = $this->db->insert_id();
		$this->db->query("INSERT INTO ".UC_DBTABLEPRE."memberfields SET uid='$uid'");
        
        //同步注册 dede  tipask
      
        $password = md5($oldp);
        if($uid)
        {
            file_get_contents("http://127.0.0.1/extend/ask.php?m=Home&c=Login&a=reg&key=123456&username={$username}&password={$password}&email={$email}&uid={$uid}");
            file_get_contents("http://127.0.0.1/extend/dede.php?m=Home&c=Login&a=reg&key=123456&username={$username}&password={$password}&email={$email}&uid={$uid}");
        }
        
        
		return $uid;
	}

done!

ucenter整合shopnc、tipask、dedecms 实现单点注册登录_第2张图片

ucenter整合shopnc、tipask、dedecms 实现单点注册登录_第3张图片


ucenter整合shopnc、tipask、dedecms 实现单点注册登录_第4张图片

另外php单点开源推荐:

https://github.com/baigoStudio/baigoSSO

你可能感兴趣的:(php)