单点登录 Ucenter示例分析


Posted in PHP onOctober 29, 2013

首先我们先来了解下Ucenter登录步骤

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的同步原理,再遇到无法同步登陆,或者开发一些与UCenter接口的时候就会容易很多。

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

client.php相当于函数库

uc.php相当于回调文件

还有一个 config.inc.php 是配置文件

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

include './config.inc.php'; 
include './uc_client/client.php'; 
$usernames="feiye"; 
$passwords="789123"; 
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://127.0.0.70/api/uc.php?time=1374540644&code=14fdIufn%2B2YwkQlN9P07FEHOfZvDJupvgBgaRPn7R0DJmbEwCb23vKwO1uaeybLq3HZhtokoZrnqu7NGi09jzs684drFCbLDiSpKhk6P50MftBRA3vp4yIswhrPMl1dXo5ajB7CVZ9F8EI%2BkdFfq0E0rdyeRkuz8goeHhg" reload="1"></script>

<script type="text/javascript" src="http://127.0.0.71/api/uc.php?time=1374540644&code=07a91g8SepQwwfA3C1uN1sPhC4v6yuER1jFbVTQMK%2BQZmTkjwOz8X%2B8rWgNmKdhlXe9XXVQqAkDjN26CK6BMA19ZpLoiSW4wuNnxHAB9xXLt2VExuyf03MnEHAC%2BUdjwb58sbXGcYUpM4Bmzdm3Q92ObSp0Kk2qCd12fqg" reload="1"></script>

类似这种的js代码 就是发送给每个开启同步登陆的应用 然后 每个开启同步登陆的应用 的 回调文件 uc.php 接受到后 会进行解密 解密好后 其实 你就可以自己来写代码了 这个uc.php回调文件的代码不一定非要按照他们的格式来写 你也可以自己写你自己的代码 比如说我就是根据session来做同步登陆的
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('gwyy',$username,time()+3600,'/','127.0.0.71'); 
_setcookie('Example_auth', _authcode($uid."\t".$username, 'ENCODE')); $_SESSION['username'] = $username; 
$_SESSION['uid'] = $uid; 
} 
function synlogout($get, $post) { 
if(!API_SYNLOGOUT) { 
return API_RETURN_FORBIDDEN; 
} 
//note 同步登出 API 接口 
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); 
_setcookie('Example_auth', '', -86400 * 365); 
unset($_SESSION['username']); 
unset($_SESSION['uid']); 
session_destroy(); 
}

这样 当用户刷新了别的应用页面之后 就自动登陆了

注意 如果在UC里面添加应用 提示通信没有成功 那么原因很简单 就是没有找到你 http://xxxx/api/uc.php 这个文件 只要有这个文件在 那么通信 肯定会成功的

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

PHP 相关文章推荐
php在线生成ico文件的代码
Oct 09 PHP
浅谈apache和nginx的rewrite的区别
Feb 22 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
Nov 14 PHP
php批量添加数据与批量更新数据的实现方法
Dec 16 PHP
typecho插件编写教程(二):写一个新插件
May 28 PHP
ThinkPHP安装和设置
Jul 27 PHP
WIFI万能钥匙密码查询接口实例
Sep 28 PHP
php中让人头疼的浮点数运算分析
Oct 10 PHP
php7安装mongoDB扩展的方法分析
Aug 02 PHP
PHP排序二叉树基本功能实现方法示例
May 26 PHP
laravel框架查询数据集转为数组的两种方法
Oct 10 PHP
PHP 出现 http500 错误的解决方法
Mar 09 PHP
php中过滤非法字符的具体实现
Oct 29 #PHP
PHP时间戳 strtotime()使用方法和技巧
Oct 29 #PHP
PHP页面中文乱码分析
Oct 29 #PHP
php四种基础算法代码实例
Oct 29 #PHP
教你如何使用php session
Oct 28 #PHP
php字符编码转换之gb2312转为utf8
Oct 28 #PHP
使用PHP curl模拟浏览器抓取网站信息
Oct 28 #PHP
You might like
php 防止表单重复提交两种实现方法
2016/11/03 PHP
PHP最常用的正则表达式
2017/02/13 PHP
PHP的mysqli_ssl_set()函数讲解
2019/01/23 PHP
javaScript - 如何引入js代码
2021/03/09 Javascript
如何实现动态删除javascript函数
2007/05/27 Javascript
javascript 兼容鼠标滚轮事件
2009/04/07 Javascript
半角全角相互转换的js函数
2009/10/16 Javascript
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
用jquery生成二级菜单的实例代码
2013/06/24 Javascript
javascript获取隐藏dom的宽高 具体实现
2013/07/14 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
jQuery动画效果图片轮播特效
2016/01/12 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
js实现分页功能
2017/05/24 Javascript
详解vue 模版组件的三种用法
2017/07/21 Javascript
Bootstrap图片轮播效果详解
2017/10/17 Javascript
jquery动态添加以及遍历option并获取特定样式名称的option方法
2018/01/29 jQuery
浅析vue深复制
2018/01/29 Javascript
Vue中实现回车键切换焦点的方法
2020/02/19 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
wepy--用vantUI 实现上弹列表并选择相应的值操作
2020/11/03 Javascript
[01:18:31]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第一场 1月10日
2021/03/11 DOTA
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
详解在Python程序中解析并修改XML内容的方法
2015/11/16 Python
python爬虫爬取某站上海租房图片
2018/02/04 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
两道JAVA笔试题
2016/09/14 面试题
综合测评自我鉴定
2013/10/08 职场文书
市场营销方案范文
2014/03/11 职场文书
美术指导求职信
2014/03/17 职场文书
欢迎词范文
2015/01/27 职场文书
《鲸》教学反思
2016/02/23 职场文书
Python中的min及返回最小值索引的操作
2021/05/10 Python
Nginx配置https的实现
2021/11/27 Servers
MySQL count(*)统计总数问题汇总
2022/09/23 MySQL