单点登录 Ucenter示例分析_php实例

首先我们先来了解下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然后进入登陆模式。

时间: 2024-08-29 01:41:54

单点登录 Ucenter示例分析_php实例的相关文章

Yii2中cookie用法示例分析_php实例

本文实例讲述了Yii2中cookie用法.分享给大家供大家参考,具体如下: <?php //设置方法 $cookie = new Cookie([ 'name' => 'cookie_monster', 'value' => 'Me want cookie!', 'expire' => time() + 86400 * 365, ]); \Yii::$app->getResponse()->getCookies()->add($cookie); //读取方法 $v

php中serialize序列化与json性能测试的示例分析_php实例

最近需要对大数组做存储,需要在serialize序列化和json之间做了选择.因此需要做了性能测试. 在php5.2之前对数组存储的时候,大都使用serialize系列化.php5.2之后,开始内置了 JSON 的支持. 在网上看到有些资料说:json_encode和json_decode比内置的serialize和unserialize函数要高效.耳闻不如眼见,眼见不一定为实.那就用实际数据测试吧..... 我们先理解概念: 一. 序列化 序列化是将对象状态转换为可保持或可传输的格式的过程.与

Yii中实现处理前后台登录的新方法_php实例

本文实例讲述了Yii中实现处理前后台登录的新方法.分享给大家供大家参考,具体如下: 因为最近在做一个项目涉及到前后台登录问题,我是把后台作为一个模块(Module)来处理的.我看很多人放两个入口文件index.php和admin.php,然后分别指向前台和后台.这种方法固然很好,可以将前后台完全分离,但我总觉得这种方式有点牵强,这和两个应用啥区别?还不如做两个App用一个framework更好.而且Yii官方后台使用方法也是使用Module的方式.但是Moudle的方式有一个很头疼的问题,就是在

ThinkPHP中数据操作案例分析_php实例

本文实例分析了ThinkPHP中数据操作方法.分享给大家供大家参考.具体如下: 模板中使用函数,相信大部分的TPer都知道也用过吧. 案例: 获取用户名的方法 function get_username($uid){ $row = M('User')->getbyUid($uid); return $row['username']; } 在模板中通过uid显示用户名 <volist name="rows" id="row"> <tr>

Yii框架登录流程分析_php实例

本文详细分析了Yii框架的登录流程.分享给大家供大家参考.具体分析如下: Yii对于新手来说上手有点难度,特别是关于session,cookie和用户验证.现在我们就Yii中登录流程,来讲讲Yii开发中如何设置session,cookie和用户验证方面的一些通用知识 1. 概述 Yii是一个全栈式的MVC框架,所谓全栈式指的是Yii框架本身实现了web开发中所要用到的所有功能,比如MVC,ORM(DAO/ActiveRecord), 全球化(I18N/L10N), 缓存(caching), 基于

QQ登录 PHP OAuth示例代码_php实例

根据官方文档编写 复制代码 代码如下: <?php /** * 申请http://connect.opensns.qq.com/apply * 列表http://connect.opensns.qq.com/my */ session_start(); $qq_oauth_config = array( 'oauth_consumer_key'=>'*******',//APP ID 'oauth_consumer_secret'=>'******************',//APP

php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析_php实例

示例代码,用到了函数substr与iconv_substr,mb_substr 复制代码 代码如下: <html><head><meta charset='utf-8'><title>截取中文字符串__www.jb51.net</title></head><body><?php$str='123456欢迎大家的光临';echo substr($str,0,4);echo '<br>';echo iconv

PHP爬虫之百万级别知乎用户数据爬取与分析_php实例

这次抓取了110万的用户数据,数据分析结果如下: 开发前的准备 安装Linux系统(Ubuntu14.04),在VMWare虚拟机下安装一个Ubuntu: 安装PHP5.6或以上版本: 安装MySQL5.5或以上版本: 安装curl.pcntl扩展. 使用PHP的curl扩展抓取页面数据 PHP的curl扩展是PHP支持的允许你与各种服务器使用各种类型的协议进行连接和通信的库. 本程序是抓取知乎的用户数据,要能访问用户个人页面,需要用户登录后的才能访问.当我们在浏览器的页面中点击一个用户头像链接

PHP文件缓存smarty模板应用实例分析_php实例

本文实例分析了PHP文件缓存smarty模板应用.分享给大家供大家参考,具体如下: 一.使用缓存 要开启smarty的缓存,只需将caching设为true,并指定cache_dir即可. 使用cache_lefetime指定缓存生存时间,单位为秒 要对相同页面生成多个不同的缓存,在display或fetch中加入第二参数cache_id,如: $smarty->display('index.tpl',$my_cache_id); 此特性可用于对不同的$_GET进行不同的缓存  二.清除缓存 c