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地址 以discuz举例:
一、用户登录检查与用户登录验证logging.php 在bbs的logging.php中如下代码段 } elseif($action == 'login') { if($discuz_uid) {
检查用户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 ?>
---------------------文件内容结束---------------------- 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) { 密钥“算法”: $discuz_auth_key= md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']); 也就是不同用户加密cookie的密钥可能不同; 三、检查用户是否已登录(无论是那个应用下登录): discuz的include目录中common.inc.php中有这样的代码:
这段代码就是解码在uc.php中用密钥($discuz_auth_key)加密的cookie值,以获得用户id($discuz_uid) 这里的解密函数位于bbs\include\global.func.php中,虽然未给函数传递cookie密钥,但函数中通过全局变量$GLOBALS['discuz_auth_key'])获得密钥。 |
Ucenter通信原理
最新推荐文章于 2024-08-08 15:12:59 发布