ucenter的同步登陆,可以整个多个应用的会员系统,实现同步登陆 同步注销等等
版本: UCenter_1.6.0_SC_UTF8 (下载的时候认准 discuz.net)
PHP版本: 5.6
1 首先解压ucenter软件包,然后可以看到里面有几个文件夹 分别是 advanced readme upload utilities
2. 然后upload这个文件夹就是Ucenter的服务器端 ,建好数据库,安装好就行,我这边改名为ucserver
3.现在我们来实验一下
4 还是刚刚的文件夹 里面有一个demo ,在advanced里的examples
5 我们把它复制到 服务器的根目录 命名为examples1 ,用http://localhost/examples 访问 。目录结果如下 (ucclient就是examples1,网上来的图,哈哈)
config.inc.php文件和uc_client文件夹(这个在上一级目录),放到自己站点的一个目录下
uc_client文件夹,是一个很重要的类库,当然其实他不只是类库,但是他最重要的作用就是给我们提供相应的同步方法,这些同步方法,都是用来通知ucenter server的(也可以认为就是调用ucenter的方法)。
config.inc.php这个配置文件,配置了我们需要的参数的,比如ucenter server的url等等,都是写很重要的参数,在uc.php和uc_client中都会用到。
include没有什么用,这里只是为了让他不报错,加入的。你可以改造uc.php后,将include目录去除。
6 现在我们登陆到ucenter的后台 添加应用
添加
如果是自己做的网站请选其他 ,应用ip一般为空,通讯密钥说一下,它和你的网站根目录的 config.inc.php的这段对应
define('UC_KEY', '1234567890'); // 与 UCenter 的通信密钥, 要与 UCenter 保持一致
还有 UC_APPID 也要做好对应,添加后会有一个ID号
define('UC_APPID', 2);
添加提交后,如果提示通讯成功说明成功了。
如果通讯失败,看看网站目录结构是否不正确,然后把ip也加上去
还有uc的连接参数也要正确填写
define('UC_DBHOST', 'localhost'); // UCenter 数据库主机
define('UC_DBUSER', 'root'); // UCenter 数据库用户名
define('UC_DBPW', ''); // UCenter 数据库密码
define('UC_DBNAME', 'uc'); // UCenter 数据库名称
define('UC_DBCHARSET', 'utf8'); // UCenter 数据库字符集
define('UC_DBTABLEPRE', 'uc.uc_'); // UCenter 数据库表前缀
3.1 弄好后,我们在 http://localhost/examples/ucexample_1.php注册一个xiaoming ,然后到ucenter后台的用户管理看看是否注册成功
3.2 我们把上面的examples1 再复制一份出来,命名为examples2 吧。注意配置好应用,并通讯成功。这样就能模拟多一个站点出来
3.3 好了,做好上面的准备工作后。我们用xiaoming登陆一下 (http://localhost/examples2/ucexample_1.php?example=login)
3.4 我们再回去看看 http://localhost/examples1是否也同步登陆了。
如果不行,有可能是cookie冲突了。 把 examples2下的uc.php里的synlogin方法里 的cookie的名字改一下
我这里改为Example_auth2了 ,因为examples1的是Example_auth
3.5 上面的只是单纯cookie登陆,没有连接数据库,需要的可以看看demo里的code文件夹的 login_db.php
3.6 同样的,同步注册点击demo里的注册就好了
为什么可以同步呢
我们来看看demo里登陆过程
list($uid, $username, $password, $email) = uc_user_login($_POST['username'], $_POST['password']);
setcookie('Example_auth', '', -86400);
if(!$db->result_first("SELECT count(*) FROM {$tablepre}members WHERE uid='$uid'")) {
//判断用户是否存在于用户表,不存在则跳转到激活页面
$auth = rawurlencode(uc_authcode("$username\t".time(), 'ENCODE'));
echo '您需要需要激活该帐号,才能进入本应用程序
继续';
exit;
}
//用户登陆成功,设置 Cookie,加密直接用 uc_authcode 函数,用户使用自己的函数
setcookie('Example_auth', uc_authcode($uid."\t".$username, 'ENCODE'));
//生成同步登录的代码
$ucsynlogin = uc_user_synlogin($uid);
echo '登录成功'.$ucsynlogin.'
继续';
exit;
1. 首先 1 -8 行就是判断账号的正确性了
2. 然后生成cookie
3. 重点来了最后调用这个方法 uc_user_synlogin 同步其他应用,意思是我这边已经登录了,你也设置cookie登陆吧
4. 调用这个方法后 ucenter就会 通知到其他应用,如 examples2应用下的 api下的uc.php下的 synlogin 方法
5 .那我们再来看看 这个 synlogin 方法
function synlogin($get, $post) {
$uid = $get['uid'];
$username = $get['username'];
if(!API_SYNLOGIN) {
return API_RETURN_FORBIDDEN;
}
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
_setcookie('Example_auth2', _authcode($uid."\t".$username, 'ENCODE'));
}
可以看出这个方法接受到uid和username这些参数后,生成了cookie
就获得了 登陆状态。
当然了不同的cms和网站,cookie的名字和生成cookie的值的方式是不一样的
这个需要根据具体需求二次开发
6. 除了同步登陆 还有同步注册,同步登出等等,具体看demo了
由于ucenter的同步登陆主要是用cookie来实现,这里就涉及到一个跨域问题。
所以在二次开发的时候注意不要删掉这个,这个是拿来解决跨域问题的。
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
原理:
https://www.iteye.com/blog/xuebingnanmm-627840