Ucenter 会员同步登录通讯原理

1,用户登录bbs,通过logging.php文件中,使用函数 uc_user_login验证,如果验证成功,将调用函数uc_user_synlogin(位于uc_client下的client.php文件中),在这个函数中调用 uc_api_post('user', 'synlogin', array('uid'=>$uid));之后向UC_API.'/index.php'传递了数据;这里的UC_API就是在 config.inc.php中的定义的uc_server之URL地址

2,uc_server的index.php接受参数数据,获得model为user,action为synlogin,就调用control目录下的user.php类中的onsynlogin方法,通过foreach循环,以javascript的方式通知uc应用列表中的应用同步登录;即通过get方式传递给应用目录中api下的uc.php一些数据;

3,uc.php接收通知并处理get过来的数据,并在函数synlogin(位于uc.php中)通过函数_authcode加密数据(默认以UC_KEY作为密钥),用函数_setcookie设置cookie;

4,各个应用在适当的文件中用对应的密钥解码上面设置的cookie,得到用户id等数据;通过这个值来判断用户是否经过其它应用登录过;

 

discuz举例:

一、用户登录检查与用户登录验证logging.php

在bbs的logging.php中如下代码段

} elseif($action == 'login') {

if($discuz_uid) {

   $ucsynlogin = '';

   showmessage('login_succeed', $indexname);

}

检查用户id变量$discuz_uid是否为空来判断,用户是否登录(包括从别的应用登录。)

如果用户从bbs登录,则在登录验证成功后通过如下代码:

$ucsynlogin = $allowsynlogin ? uc_user_synlogin($discuz_uid) : '';

通知其它应用----“用户已从bbs登录,请通知其它应用设置cookie”

(uc_server通过javascript调用方式向其它应用的api/uc.php传递数据)

可以在uc应用目录下新建一个名为test.php的文件,来模拟登录成功,请求uc_server通知其它应用。文件内容为:

---------------------文件内容开始----------------------

<?php

include_once "config.inc.php";

include_once "./uc_client/client.php";

echo uc_user_synlogin(1);

echo "<pre>";

var_dump($_COOKIE);

echo "</pre>";

?>

<script type="text/javascript">

var obj=document.getElementsByTagName("script");

for(var i=0;i<obj.length-1;i++) {

   document.write("<a href=/""+obj[i].src+"/">"+obj[i].src+"</a><hr>");

}

</script>

---------------------文件内容结束----------------------

ps:这段测试代码还可以测试同步登录不好使的情况,具体使用方法,你可以思考一下(本文后面也有介绍),有问题可以在此文结尾发表评论与我讨论。

运行后,查看源代码即可看到javascript;

这里要注意了:这些javascript的通知中是不包含用户登录的应用的。也就是说只"通知"用户未登录的应用,因为用户通过uc_server登录成功的当前应用,当然不需要uc_server再通知了。具体代码请参看:webroot/uc_server/control/user.php中的onsynlogin函数的这句:

if($app['synlogin'] && $app['appid'] != $this->app['appid'])

代码解释:

$app['synlogin']是uc应用是否允许同步登录

而且应用id不等于用户当前登录的应用id

$app数组就是uc_server/data/cache/apps.php中的数组$_CACHE['apps'];

$this->app就是用户登录的应用

二、接受其它应用的同步登录通知:

在discuz的api目录下的uc.php中的函数synlogin,在这里接受uc_server发送过来的“同步登录通知”,并设置discuz的cookie,在这个函数中你可以查看到cookie的加密密钥的“算法”;

如果你想看看uc_server发送过的的“通知”是什么数据,你可以这么做:

1,修改要接受通知的应用目录下的api/uc.php,在$action = $get['action'];代码下面添加如下代码:

echo "<pre>";var_dump($get);echo "</pre>";die("<hr>api/uc.php");

2,将上面建立的test.php文件放置在其它允许同步登录的应用目录下,并在浏览器中运行,然后点击页面中对应第一步的应用链接,即可看到uc_server“通知”给改应用的数据;

---------------------------分割线-------------------------------

function synlogin($get, $post)

在这个函数中通过_authcode函数,以密钥$discuz_auth_key加密了cookie;

在这里为了避免cookie名称冲突,在cookie名称(一般为:auth)前加了前缀($cookiepre),这个前缀也就是在config.inc.php中设置的那个cookie前缀值;

请看设置cookie的函数_setcookie:

(通过参数$prefix来判断是否对cookie名称添加前缀$cookiepre)

function _setcookie($var, $value, $life = 0, $prefix = 1) {

global $cookiepre, $cookiedomain, $cookiepath, $timestamp, $_SERVER;

setcookie(($prefix ? $cookiepre : '').$var, $value,

   $life ? $timestamp + $life : 0, $cookiepath,

   $cookiedomain, $_SERVER['SERVER_PORT'] == 443 ? 1 : 0);

}

密钥“算法”:

$discuz_auth_key= md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);

也就是不同用户加密cookie的密钥可能不同;

三、检查用户是否已登录(无论是那个应用下登录):

discuz的include目录中common.inc.php中有这样的代码:

$discuz_auth_key = md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);

list($discuz_pw, $discuz_secques, $discuz_uid) = empty($_DCOOKIE['auth']) ? array('', '', 0) : daddslashes(explode("/t", authcode($_DCOOKIE['auth'], 'DECODE')), 1);

这段代码就是解码在uc.php中用密钥($discuz_auth_key)加密的cookie值,以获得用户id($discuz_uid)

这里的解密函数位于bbs/include/global.func.php中,虽然未给函数传递cookie密钥,但函数中通过全局变量$GLOBALS['discuz_auth_key'])获得密钥。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在ThinkPHP6中,可以通过Ucenter实现用户注册登录,以下是代码示例: 1. 安装Ucenter扩展包 在项目根目录下执行以下命令安装Ucenter扩展包: ``` composer require topthink/think-ucenter ``` 2. 配置Ucenter参数 在项目配置文件`config/ucenter.php`中配置Ucenter参数: ```php return [ // Ucenter配置参数 'uc' => [ 'url' => 'http://ucenter.example.com', // Ucenter接口地址 'key' => 'your-ucenter-key', // Ucenter的通信密钥 'appid' => 'your-ucenter-appid', // Ucenter的应用ID ] ]; ``` 3. 创建用户模型 创建一个用户模型`app\model\User.php`,并继承Ucenter提供的`think\ucenter\User`类: ```php namespace app\model; use think\ucenter\User as UcenterUser; class User extends UcenterUser { // 自定义用户模型属性和方法 } ``` 4. 用户注册 在用户注册的控制器中,可以通过以下代码实现用户注册: ```php use app\model\User; class Register { public function index() { $user = new User(); $result = $user->register('username', 'password', 'email'); // 用户名、密码、邮箱 if ($result['status'] == 1) { // 注册成功 } else { // 注册失败 } } } ``` 5. 用户登录 在用户登录的控制器中,可以通过以下代码实现用户登录: ```php use app\model\User; class Login { public function index() { $user = new User(); $result = $user->login('username', 'password'); // 用户名、密码 if ($result['status'] == 1) { // 登录成功 } else { // 登录失败 } } } ``` 6. 用户退出 在用户退出的控制器中,可以通过以下代码实现用户退出: ```php use app\model\User; class Logout { public function index() { $user = new User(); $user->logout(); // 退出成功 } } ``` 以上就是通过Ucenter实现用户注册登录的代码示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值