zl程序教程

您现在的位置是:首页 >  其它

当前栏目

单点登录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个应用都设置了同步登陆之后当你登陆一个应用然后执行
复制代码代码如下:

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然后进入登陆模式。