单点登录Ucenter示例分析
分析 示例 登录 单点 ucenter
2023-06-13 09:15:07 时间
首先我们先来了解下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个应用都设置了同步登陆之后当你登陆一个应用然后执行
复制代码代码如下:
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));
echouc_user_synlogin($uid);
echo"登录成功";
}elseif($uid==-1){
echo"用户不存在,或者被删除";
}elseif($uid==-2){
echo"密码错";
}else{
echo"未定义";
}
uc_user_synlogin()这个函数代表着要同步登陆到其他所有开启同步登陆的函数uc自己会在后台把所有开启同步登陆的应用都给循环遍历一遍然后在页面上输出
<scripttype="text/javascript"src="http://127.0.0.70/api/uc.php?time=1374540644&code=14fdIufn%2B2YwkQlN9P07FEHOfZvDJupvgBgaRPn7R0DJmbEwCb23vKwO1uaeybLq3HZhtokoZrnqu7NGi09jzs684drFCbLDiSpKhk6P50MftBRA3vp4yIswhrPMl1dXo5ajB7CVZ9F8EI%2BkdFfq0E0rdyeRkuz8goeHhg"reload="1"></script>
<scripttype="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来做同步登陆的
functionsynlogin($get,$post){
$uid=$get["uid"];
$username=$get["username"];
if(!API_SYNLOGIN){
returnAPI_RETURN_FORBIDDEN;
}
header("P3P:CP="CURaADMaDEVaPSAoPSDoOURBUSUNIPURINTDEMSTAPRECOMNAVOTCNOIDSPCOR"");
setcookie("gwyy",$username,time()+3600,"/","127.0.0.71");
_setcookie("Example_auth",_authcode($uid."\t".$username,"ENCODE"));
$_SESSION["username"]=$username;
$_SESSION["uid"]=$uid;
}
functionsynlogout($get,$post){
if(!API_SYNLOGOUT){
returnAPI_RETURN_FORBIDDEN;
}
//note同步登出API接口
header("P3P:CP="CURaADMaDEVaPSAoPSDoOURBUSUNIPURINTDEMSTAPRECOMNAVOTCNOIDSPCOR"");
_setcookie("Example_auth","",-86400*365);
unset($_SESSION["username"]);
unset($_SESSION["uid"]);
session_destroy();
}
这样当用户刷新了别的应用页面之后就自动登陆了
注意如果在UC里面添加应用提示通信没有成功那么原因很简单就是没有找到你http://xxxx/api/uc.php这个文件只要有这个文件在那么通信肯定会成功的
其实UC的原理很简单就是某个应用登陆后然后后台轮询发送给同步登陆的应用的回调文件回调文件接收到用户ID之后生成cookie或者session然后进入登陆模式。
相关文章
- uIP协议栈分析_协议栈
- 激光熔覆技术工艺及应用分析
- wpf绘图性能分析
- Nginx日志分析
- 【CSS】浮动 ④ ( 浮动布局案例 - 电商布局模块 | 案例分析 | 布局测量摆放 | 浮动布局代码示例 )
- 【Android 高性能音频】hello-oboe 示例解析 ( Oboe 源代码依赖 | CMakeList.txt 构建脚本分析 | Oboe 源代码构建脚本分析 )
- 【CSS】盒子模型内边距 ③ ( 盒子模型内边距案例 | 使用 Fireworks 分析网页 | 缩放图片 | 切片工具测量图片 | 吸管工具获取图片颜色 | 代码示例 )
- 国网B接口调阅实时视频规范解读和代码示例分析
- Java多线程:ReentrantLock源码分析
- R语言单位根、协整关系Granger因果检验、RESET分析汇率在岸和离岸数据时间序列
- Mysql索引结合explain分析示例
- Spark源码分析之RDD的生成及stage的切分详解大数据
- Hadoop2源码分析-YARN RPC 示例介绍详解大数据
- Linux日志文件:记录与分析(linuxlog文件)
- MySQL高可用方案:分析和比较(mysql高可用方案比较)
- [SpaceSniffer] 空间嗅探器可能是最好的文件和文件夹结果与大小分析工具
- 情况Linux下端口号占用情况分析(linux端口号占用)
- MySQLunion语法代码示例分析
- jdbc连接sqlserver数据库问题分析
- php中serialize序列化与json性能测试的示例分析
- ajax动态为a标签href赋值不执行跳转的原因分析及解决
- 浅析ajax请求json数据并用js解析(示例分析)
- c语言中static的用法详细示例分析
- 输出java进程的jstack信息示例分享通过线程堆栈信息分析java线程
- python中__call__方法示例分析
- JS中三目运算符和ifelse的区别分析与示例