简单分析ucenter 会员同步登录通信原理


Posted in PHP onAugust 25, 2014

1、用户登录discuz,通过logging.php文件中的函数uc_user_login对post过来的数据进行验证,也就是对username和password进行验证。

2、如果验证成功,将调用位于uc_client下client.php文件中的函数uc_user_synlogin,在这个函数中调用 uc_api_post('user', 'synlogin', array('uid'=>$uid))。

3、然后这个函数后向Ucenter的index.php传递数据,index.php接受传递的数据,获得model为user,action为synlogin的值。

4、然后Ucenter的index.php调用control目录下的user.php类中的onsynlogin方法,通过foreach循环,以javascript的方式通知uc应用列表中开启同步登陆的应用进行同步登录;即通过get方式传递给各个应用目录中api下的uc.php一些数据。

5、uc.php接收通知并处理get过来的数据,并在函数synlogin(位于uc.php中)通过函数_authcode加密数据(默认以UC_KEY作为密钥),用函数_setcookie设置cookie。

6、各个应用用对应的密钥解码上面设置的cookie,得到用户id等数据;通过这个值来判断用户是否经过其它应用登录过,从而让用户可以自动登陆。

应用程序的logging.php ------>uc_client中的client.php------>Ucenter------>其他应用程序中的api/uc.php。

其实Ucenter实现同步登陆的原理就是cookie,一个应用登陆成功之后,向Ucenter传递数据,让Ucenter通知其他的应用也设置cookie,这样用户在访问其他应用的时候通过已经设置好的cookie实现自动登陆。

大致步骤 ,首先要安装 ucenter 然后把uc_client 这个文件夹复制到自己的项目里面去 ,然后呢在配置几个文件

client.php相当于函数库

uc.php相当于回调文件

config.php 是配置文件

当你有2个应用都设置了同步登陆之后  当你登陆一个应用 然后执行

include './config.inc.php';
include './uc_client/client.php';
$usernames="kyee";
$passwords="123456";
list($uid, $username, $password, $email) = uc_user_login($usernames, $passwords);
if($uid > 0) {

setcookie("username",$username,time()+intval(24*3600));
echo uc_user_synlogin($uid);
echo '登录成功';
} elseif($uid == -1) {
echo '用户不存在,或者被删除';
} elseif($uid == -2) {
echo '密码错误';
} else {
echo '未定义';
}

uc_user_synlogin() 这个函数 代表着 要同步登陆到其他所有开启同步登陆的函数  uc自己会在后台把所有开启同步登陆的应用都给循环遍历一遍 然后 在页面上输出 

<script type="text/javascript" src="http://rayibeauty.ck101.com/api/uc.php?time=1408327309&code=bc6bFLa6WH343nin2GAn%2F82Y9cnCennPk1gcLGYHdQF4wsXsOSdTyqBb2Nuoxe0UJqzWMWncdx%2FfQ1GK6FS%2BqJqi2AxVG2Oq1pD9c1wZy%2BgjXs7qo4mm2sxFVHwW7JnjKGPDkVdDqtYeybkSISz7yrdb0ZFuXH2yr3Cq" reload="1"></script>

<script type="text/javascript" src="http://kibeauty.ibeauty.tw/api/uc.php?time=1408327309&code=206flCqeb%2Faft%2FDFPno9Bvqsb1b0o6XTZdIByOoD7EC11vMrjzC7PaKLo0LF3tGiHwlwZkwdW5VDHq866MGulsco5nekfkL341VWp7BPabnZPNtgG7m4jZpfdx6nVP0LTJLYI%2BkebI7uLm58atk8Ex4sKBj%2FfDkjH%2F8z" reload="1"></script>

类似这种的js代码 ,就是发送给每个开启同步登陆的应用, 然后每个开启同步登陆的应用的回调文件 uc.php 接受到后会进行解密,解密好后其实你就可以自己来写代码了,这个uc.php回调文件的代码不一定非要按照他们的格式来写 ,你也可以自己写你自己的代码 。

其实UC的原理很简单 ,就是某个应用登陆后,然后后台轮询发送给同步登陆的应用的回调文件 ,回调文件接收到用户ID之后,生成cookie或者session然后进入登陆模式。

PHP 相关文章推荐
用PHP连接Oracle for NT 远程数据库
Oct 09 PHP
PHP 文件上传功能实现代码
Jun 24 PHP
php设计模式 Adapter(适配器模式)
Jun 26 PHP
用php简单实现加减乘除计算器
Jan 06 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
Aug 22 PHP
php微信公众号开发(3)php实现简单微信文本通讯
Dec 15 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
Mar 09 PHP
php防止表单重复提交实例讲解
Feb 11 PHP
PHP判断是否微信访问的方法示例
Mar 27 PHP
PHP抽象类与接口的区别实例详解
May 09 PHP
PHP中define() 与 const定义常量的区别详解
Jun 25 PHP
laravel-admin 在列表页添加自定义按钮的例子
Sep 30 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
Aug 25 #PHP
ThinkPHP查询返回简单字段数组的方法
Aug 25 #PHP
php防止伪造数据从地址栏URL提交的方法
Aug 24 #PHP
php批量删除数据库下指定前缀的表以prefix_为例
Aug 24 #PHP
一个图片地址分解程序(用于PHP小偷程序)
Aug 23 #PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
Aug 23 #PHP
PHP+MYSQL会员系统的开发实例教程
Aug 23 #PHP
You might like
PHP 向右侧拉菜单实现代码,测试使用中
2009/11/03 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
JQuery UI皮肤定制
2009/07/27 Javascript
jquery select选中的一个小问题
2009/10/11 Javascript
获取body标签的两种方法
2011/10/13 Javascript
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
jquery插件珍藏(图片局部放大/信息提示框)
2013/01/08 Javascript
javascript使用正则表达式检测IP地址
2014/12/03 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
Node.js使用MySQL连接池的方法实例
2018/02/11 Javascript
react build 后打包发布总结
2018/08/24 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
2019/06/11 Javascript
解决layui富文本编辑器图片上传无法回显的问题
2019/09/18 Javascript
jquery实现轮播图特效
2020/04/12 jQuery
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[03:33]TI9战队采访 - Infamous
2019/08/20 DOTA
python实现在字符串中查找子字符串的方法
2015/07/11 Python
最大K个数问题的Python版解法总结
2016/06/16 Python
单利模式及python实现方式详解
2018/03/20 Python
django admin 自定义替换change页面模板的方法
2019/08/23 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
django form和field具体方法和属性说明
2020/07/09 Python
可自定义箭头样式的CSS3气泡提示框
2016/03/16 HTML / CSS
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
简历中个人求职的自我评价模板
2013/11/29 职场文书
高二物理教学反思
2014/02/08 职场文书
高中语文课后反思
2014/04/27 职场文书
2014年医务科工作总结
2014/12/18 职场文书
教育教学读书笔记
2015/07/02 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
合作意向书怎么写
2019/06/24 职场文书
日本动漫十大公认神作:第五现已全网禁播,《死亡笔记》在榜
2022/03/18 日漫