define('UC_CONNECT', 'mysql');
define('UC_DBHOST', 'localhost');
define('UC_DBUSER', 'root');
define('UC_DBPW', '');
define('UC_DBNAME', 'ultrax');
define('UC_DBCHARSET', 'utf8');
define('UC_DBTABLEPRE', '`ultrax`.pre_ucenter_');
define('UC_DBCONNECT', 0);define('UC_CHARSET', 'utf-8');
define('UC_KEY', 'M1K6F1X3Qaj5d103O8J8Labay219occ7w78d5asbb34aZfGbV2O9t9E5m288NfNd');
define('UC_API', 'http://127.0.0.1/dz/uc_server');
define('UC_APPID', '1');
define('UC_IP', '');
define('UC_PPP', 20);if($_POST)
{include "uc_client/client.php";
$username=$_POST["u"];
$password=$_POST["p"];
$f = uc_get_user($username, 0);
if(!$f)
{uc_user_register($username, $password, $username."@aaa.com");
$f = uc_get_user($username, 0);
}
echo uc_user_synlogin($f[0]) ;
}
标签归档:ucenter
uc_client/client.php 功能介绍
uc的客户端uc_clinet/client.php 功能
以uc_get_user 为例子
function uc_get_user($username, $isuid=0) { $return = call_user_func(UC_API_FUNC, 'user', 'get_user', array('username'=>$username, 'isuid'=>$isuid)); return UC_CONNECT == 'mysql' ? $return : uc_unserialize($return); } 此函数调用 client.php 内部 UC_API_FUNC 函数,一般来说UC_API_FUNC 是 定值,你在客户端的后台一般设置是mysql方式的同步 那么 define('UC_API_FUNC', UC_CONNECT == 'mysql' ? 'uc_api_mysql' : 'uc_api_post'); 也就是说 UC_API_FUNC 的值是 uc_api_mysql 下面看 uc_api_myql 函数 function uc_api_mysql($model, $action, $args=array()) { global $uc_controls; if(empty($uc_controls[$model])) { include_once UC_ROOT.'./lib/db.class.php'; include_once UC_ROOT.'./model/base.php'; include_once UC_ROOT."./control/$model.php"; eval("\$uc_controls['$model'] = new {$model}control();"); } if($action{0} != '_') { $args = uc_addslashes($args, 1, TRUE); $action = 'on'.$action; $uc_controls[$model]->input = $args; return $uc_controls[$model]->$action($args); } else { return ''; } } 表示的是 包含了 control/$model.php 运行里面的 on_xxx 比如 onget_user 就是一例 function onget_user() { $this->init_input(); $username = $this->input('username'); if(!$this->input('isuid')) { $status = $_ENV['user']->get_user_by_username($username); } else { $status = $_ENV['user']->get_user_by_uid($username); } if($status) { return array($status['uid'],$status['username'],$status['email']); } else { return 0; } } 这里明显是 $_ENV['user'] 是 model/user.php 的user类引入的 在contrl/user.php 里面看的很清楚 function usercontrol() { parent::__construct(); $this->load('user'); $this->app = $this->cache['apps'][UC_APPID]; } 通过base类的load 函数 function load($model, $base = NULL) { $base = $base ? $base : $this; if(empty($_ENV[$model])) { require_once UC_ROOT."./model/$model.php"; eval('$_ENV[$model] = new '.$model.'model($base);'); } return $_ENV[$model]; } 那么好了,在user->get_user_by_username 和 $user->get_user_by_uid 函数里面选择一个,根据 isuid 来判断参数是否是uid, 从而到uc数据库的UC_DBTABLEPRE."members 根据uid还是username查找.得到的值被重新组织了!!! return array($status['uid'],$status['username'],$status['email']); 如果想得到 uid ,需要从 [0] 里面的!!!
phpcms 整合ucenter 的资料
首先此文甚好 http://down.chinaz.com/try/201208/2176_2.htm
需要注意的是phpcms 后台配置需要指明数据库的名字。
另外查看我之前的博文来解决在 phpcms 退出后不发出js通知到ucenter的各个系统。
如果需要在phpcms注册时候自动登陆到ucenter的discuz系统,还需要看这个博文
关于ucenter各个应用如何最快捷知道所有的app,看这里
记事狗微博的api/uc.php 同步登录的新注册用户问题
在记事狗微博的 api/uc.php 里面当记事狗本身用户不存在,而在uc里面存在的时候,当登录后自动注册到记事狗,需要修改代码实现。图中红线部分是重要的,必须的。
在api/uc.php 的 onsynlogin 同步登录函数里面的部分代码如下
代码如下
include_once(ROOT_PATH . 'uc_client/client.php'); if($data = uc_get_user($get["username"])) { list($uid, $uname, $email) = $data; $this->db->query("REPLACE INTO `{$this->tablepre}members` (`uid`,`ucuid`,`username`,`nickname`,`email`,`role_id`) values ('$uid','$uid','$uid','$uname','$email','2')"); $query = $this->db->query("SELECT `uid`, `password` FROM `{$this->tablepre}members` WHERE `ucuid`='$uid'"); $UserFields = $this->db->fetch_array($query); $auth = authcode("{$UserFields['password']}\t{$UserFields['uid']}","ENCODE",'',1209600); jsg_setcookie('sid', '', -311040000); jsg_setcookie('auth',$auth,311040000); }
shopex 同步 ucenter 的redirect问题,造成script不运行
首先此问题来自向这个帖子
http://hi.baidu.com/fire_love_live/item/247276cfda421217b67a24c7
需要说明的是,并非15处需要修改,
其中 有关登陆密码错的那一项建议不要修改
在大约行 557处
$this->nowredirect('failed',base64_encode(str_replace(array('+','/','='),array('_',',','~'),$_POST['ref_url'])),__('用户名或密码有误,请重新输入'),$_POST['from_minipassport']);
上面的nowredirect 不建议修改为 splash
最土整合uc的问题,其他系统可能需要调整登陆代码
问题:
最土的用户被导入到了ucenter 的用户表,其他uc_server 的客户端登陆时候提示密码错
解决思路
最土的加密方法在 ./include/classes/ZUser.class.php
const SECRET_KEY = ‘@4!@#$%@’;
static public function GenPassword($p) {
return md5($p . self::SECRET_KEY);
}
而uc的方法是 md5(md5(‘密码’) + SALT字段)
两者不相同,所以需要在其他系统里面吧最土的密码验证发也加进去,
现在以shopex为例 ,shopex系统里面uc_client 目录在shopex/core/lib/uc_client
修改里面的 model\user.php 和 control\user.php
model\user.php 修改如下
ecshop的ucenter同步登陆uc.php 一点错误勘误
在ecshop的会员整合ucenter的set_cookie函数有问题
文件在 /api/uc.php 搜索 set_cookie
function set_cookie($user_id=”, $user_name = ”, $email = ”)
{
if (empty($user_id))
{
/* 摧毁cookie */
$time = time() – 3600;
setcookie(‘ECS[user_id]’, ”, $time);//这里有问题
setcookie(‘ECS[username]’, ”, $time);//这里有问题
setcookie(‘ECS[email]’, ”, $time);//这里有问题
}
else
{
/* 设置cookie */
$time = time() + 3600 * 24 * 30;
setcookie(“ECS[user_id]”, $user_id, $time, $GLOBALS[‘cookie_path’], $GLOBALS[‘cookie_domain’]);
setcookie(“ECS[username]”, $user_name, $time, $GLOBALS[‘cookie_path’], $GLOBALS[‘cookie_domain’]);
setcookie(“ECS[email]”, $email, $time, $GLOBALS[‘cookie_path’], $GLOBALS[‘cookie_domain’]);
}
}
因为假设这样的架构
http://域名/ 是 ecshop ,http://域名/bbs/ 为论坛dzX2, 那么,在ec登陆后,dzX2 点退出,
会发送一个javascript申请到 /api/uc.php的 logout请求 ( 如果setcookie 只是在 /api/ 下 设置cookie 为空,那么就清空不了cookie
严格的应该是
setcookie(‘ECS[user_id]’, ”, $time,$GLOBALS[‘cookie_path’], $GLOBALS[‘cookie_domain’]);
还有要修改ecshop的 ucenter插件,includes/modules/integrates/ucenter.php
如图两部分
另外还要看 这一篇
/ucenter-sync.html
ecshop系列:同步ucenter,一步登陆discuzX
看到太多的各类系统整合ucenter出现的各种各样的问题,比如无法同步登入,同步退出,注册用户时候出现问题
研读过ucenter 的原理后,再结合测试 ucenter + modoer + discuz X 1.5 + ecshop 2.7.2 实现了完美的同步登入和退出
发现一个简单的方法就是,把ucenter 的data/cache/apps.php 文件复制到各个系统的 uc_client/data/cache/apps.php
就可以解决大半的同步问题
检查过上面问题后,再检查各个系统的关于ucenter 的配置处,确保key和uc里面的一致,然后清空各系统缓存,测试
另外还要看 这一篇
/ecshop-api-uc.html