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!
另外php单点开源推荐:
https://github.com/baigoStudio/baigoSSO