ucenter通信原理分析


Posted in PHP onJanuary 09, 2015

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://www.lihuai.net/wp-content/uploads/sp/uc.php?time=1408327309&code=bc6bFLa6WH343nin2GAn%2F82Y9cnCennPk1gcLGYHdQF4wsXsOSdTyqBb2Nuoxe0UJqzWMWncdx%2FfQ1GK6FS%2BqJqi2AxVG2Oq1pD9c1wZy%2BgjXs7qo4mm2sxFVHwW7JnjKGPDkVdDqtYeybkSISz7yrdb0ZFuXH2yr3Cq” reload=”1″></script>
<script type=”text/javascript” src=”http://www.lihuai.net/wp-content/uploads/sp/uc.php?time=1408327309&code=206flCqeb%2Faft%2FDFPno9Bvqsb1b0o6XTZdIByOoD7EC11vMrjzC7PaKLo0LF3tGiHwlwZkwdW5VDHq866MGulsco5nekfkL341VWp7BPabnZPNtgG7m4jZpfdx6nVP0LTJLYI%2BkebI7uLm58atk8Ex4sKBj%2FfDkjH%2F8z” reload=”1″></script>

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

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

PHP 相关文章推荐
ajax缓存问题解决途径
Dec 06 PHP
PHP+AJAX实现无刷新注册(带用户名实时检测)
Jan 02 PHP
php防注入,表单提交值转义的实现详解
Jun 10 PHP
PHP面向对象教程之自定义类
Jun 10 PHP
php批量删除数据库下指定前缀的表以prefix_为例
Aug 24 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
Oct 15 PHP
php抓取网站图片并保存的实现方法
Oct 29 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
Jan 07 PHP
教你php如何实现验证码
Jan 20 PHP
ThinkPHP开发--使用七牛云储存
Sep 14 PHP
PHP后期静态绑定实例浅析
Dec 21 PHP
thinkphp5 redis缓存新增方法实例讲解
Mar 24 PHP
PHP上传文件时自动分配路径的方法
Jan 09 #PHP
PHP中new static() 和 new self() 的区别介绍
Jan 09 #PHP
PHP中的替代语法介绍
Jan 09 #PHP
php获取客户端电脑屏幕参数的方法
Jan 09 #PHP
PHP计算百度地图两个GPS坐标之间距离的方法
Jan 09 #PHP
php实现按照权重随机排序数据的方法
Jan 09 #PHP
PHP实现采集抓取淘宝网单个商品信息
Jan 08 #PHP
You might like
编译问题
2006/10/09 PHP
php格式化工具Beautify PHP小小BUG
2008/04/24 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
js调用AJAX时Get和post的乱码解决方法
2013/06/04 Javascript
javascript 数字格式化输出的实现代码
2013/12/10 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
Angular企业级开发——MVC之控制器详解
2017/02/20 Javascript
Node.JS利用PhantomJs抓取网页入门教程
2017/05/19 Javascript
vue的安装及element组件的安装方法
2018/03/09 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
ES6 Set结构的应用实例分析
2019/06/26 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
javascript执行上下文、变量对象实例分析
2020/04/25 Javascript
vue proxy 的优势与使用场景实现
2020/06/15 Javascript
koa2 数据api中间件设计模型的实现方法
2020/07/13 Javascript
[01:00:04]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第二局
2016/02/26 DOTA
python创建关联数组(字典)的方法
2015/05/04 Python
Python实现SVN的目录周期性备份实例
2015/07/17 Python
浅析python递归函数和河内塔问题
2017/04/18 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
Pycharm取消py脚本中SQL识别的方法
2018/11/29 Python
python psutil模块使用方法解析
2019/08/01 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
解决导入django_filters不成功问题No module named 'django_filter'
2020/07/15 Python
HTML5中form如何关闭自动完成功能的方法
2018/07/02 HTML / CSS
Final类有什么特点
2012/04/25 面试题
大学同学十年聚会感言
2014/02/21 职场文书
市场营销管理毕业生自荐信
2014/03/03 职场文书
2014年学校安全工作总结
2014/11/13 职场文书
调任通知
2015/04/21 职场文书
2015年支教教师工作总结
2015/07/22 职场文书
医院保洁员管理制度
2015/08/05 职场文书
2019公司借款合同范本2篇!
2019/07/24 职场文书