`
xuebingnanmm
  • 浏览: 176499 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Ucenter通信原理

    博客分类:
  • PHP
阅读更多

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'])获得密钥。

分享到:
评论

相关推荐

    ucenter通信原理分析

    主要介绍了ucenter通信原理分析,大名鼎鼎的ucenter相信做站长的都知道,本文即来分析它的实现原理,需要的朋友可以参考下

    简单分析ucenter 会员同步登录通信原理

    UCenter是Comsenz旗下各个产品之间信息直接传递的一个桥梁,通过UCenter 站长可以无缝整合Comsenz系列产品,实现用户的一站式登录以及社区其他数据的交互。其实何止是comsenz系列产品,可以这么说整合了 ucenter 就...

    ucenter整合原理和流程

    **Ucenter 整合原理和流程详解** Ucenter 是 Comsenz 公司推出的一款用户整合解决方案,旨在统一管理多个应用中的用户数据,实现多应用之间的用户同步登录和信息共享。它由 Server 端和 Client 端两部分组成。 1. ...

    详解ucenter原理及第三方应用程序整合思路、方法

    ### 详解uCenter原理及第三方应用程序整合思路、方法 #### 一、uCenter的功能与价值 uCenter作为一款强大的用户中心管理系统,不仅能够实现不同PHP应用程序之间的用户数据整合,还能跨语言支持ASP/ASP.NET/PHP/JSP...

    destoon整合UCenter图文教程

    1、首先登录UCenter管理中心 添加应用   2、填写完毕后,点提交,将页面滚动至底部 复制其中的Ucenter配置信息至记事本   注意图中的数据表前缀和API地址 ... 您可能感兴趣的文章:ucenter通信原理分析简单分析ucen

    ucenter.7z

    三、Ucenter通信机制 Ucenter通过HTTP或Socket方式与各应用进行通信,主要涉及以下几个接口: 1. uc_api:应用调用Ucenter API的入口,用于执行登录、注册、获取用户信息等操作。 2. uc_server:Ucenter服务器端的...

    ucenter会员系统对接类

    5. **错误处理**: 完善错误处理机制,当与Ucenter服务器通信失败或出现异常时,能给出合理的提示和处理方案。 通过以上介绍,我们可以看出Ucenter会员系统对接类在多站点用户管理中的重要作用,它简化了开发者的...

    Ucenter数据字典及系统分析文档

    在“UCENTER研究”中,我们会发现涉及到Ucenter的工作原理和最佳实践。Ucenter采用中心化的用户认证方式,当用户在一个应用中注册或登录后,其信息会同步到Ucenter服务器,其他应用通过调用接口验证用户的身份。此外...

    Ucenter文档

    3. 集成API:在你的PHP程序中,你需要调用Ucenter提供的API接口,通过HTTP请求与Ucenter通信。每个接口都有详细的使用说明,开发者需按照规范进行编码。 4. 测试与调试:完成API集成后,应进行详尽的测试,确保用户...

    ucenter的详细手册整合网站数据

    3. **同步机制**:解析Ucenter的数据同步原理,包括注册、登录、修改信息等操作的同步流程。 4. **权限控制**:讲解如何设置和管理用户的权限,保护用户数据的安全。 5. **数据管理**:涵盖用户数据的导入、导出,...

    JAVA_UCenter

    UCenter交互的API,理解API的设计原理和使用方法是使用JAVA_UCenter的关键,包括如何调用接口、传递参数、处理返回结果等。 3. **HTTP通信**:由于Discuz! UCenter 与Java应用之间的通信通常基于HTTP协议,因此...

    asp.net版ucenter接口程序源码_ucenterapi.zip

    - HTTP通信:了解HTTP请求和响应的原理,以及如何发送POST或GET请求。 - XML/JSON解析:Ucenter的API通常使用XML或JSON格式交换数据,因此需要能够解析和构建这些格式的数据。 - 安全性:处理用户敏感信息(如密码)...

    ucenter,uchome,discuz同步注册免激活同步登录

    总的来说,要实现这个功能,你需要理解Ucenter的API接口工作原理,熟悉PHP编程,以及对Ucenter、Uchome和Discuz! 的配置有深入的了解。确保正确配置和覆盖文件后,你的社区用户就能享受到便捷的一站式登录体验了。在...

    Yii+Framework应用通过UCenter整合discuz视频教程

    2. **UCenter 集成原理**:理解 UCenter 的工作方式,包括用户认证、数据同步、API 接口调用等核心功能。UCenter 提供了多种接口,如用户注册、登录、资料修改等,使得其他应用能够与其无缝对接。 3. **Discuz! ...

    asp.Net整合UCenter借口

    在ASP.NET环境中,我们需要通过开发特定的接口来与UCenter进行通信。 首先,我们需要了解UCenter的主要功能。UCenter提供API接口,允许外部应用与其交互,包括用户注册、登录、信息修改、积分同步等功能。这些接口...

    asp.net版UCenter接口(开源)下载

    3. **数据库集成**:UCenter接口需要与UCenter主系统的数据库进行通信,可能使用ADO.NET或Entity Framework等技术来处理数据库操作。 4. **身份验证和授权**:接口可能会实现一套安全机制,如OAuth或自定义认证方式...

    PHP实例开发源码—PhpSay Ucenter用户共享插件.zip

    3. **数据库脚本**:可能包含SQL文件,用于创建与Ucenter通信所需的数据库表。 4. **模板文件**:HTML/CSS/JavaScript,用于展示用户界面,如登录表单、注册表单等。 5. **逻辑处理文件**:`.php`文件,处理用户请求...

    ucenter代码分析

    - **通信接口**:用于Ucenter服务器与各应用之间的消息传递,如同步用户数据。 3. **API使用指南** - **注册与认证**:开发者首先需要在Ucenter中注册应用,并获取到AppID和AppKey,这两个参数是后续调用API的...

Global site tag (gtag.js) - Google Analytics