天天看点

phpcms的phpsso与discuz的UCenter的联调时遇到的问题

phpsso注册流程

1、【phpcms】 判断是否开启phpsso模块 没开启报错

2、【phpcms】 调用 phpcms根目录/caches/configs/system.php中phpsso_api_url变量 获取本站要通知的phpsso地址 通过socket方式向phpsso_api_url/index.php?m=phpsso&c=index&a=register发出请求 请求中存放的是通过phpsso_auth_key变量加密的post值

3、【phpsso_server】 判断是否开启Ucenter 

4、【phpsso_server】 如果开启Ucenter 判断发起类型是api还是mysql 如果是mysql 直接插入mysql数据库中 如果是api 通过socket方式向UC_API/index.php发出请求 并通过UC_KEY加密数据

5、【phpsso_server】 将数据添加到phpsso_server的数据表中

6、【phpsso_server】 添加到消息通知队列表中

7、【phpsso_server】 phpsso_server目录/caches/caches_admin/caches_data/applist.cache.php获取应用列表信息 并将消息通过socket方式向'url'.'apifilename'地址发送信息 并通过'authkey'加密

8、【phpcms】 添加至phpcms数据库中

两个网站必去要同步用户表才能登陆

1、 phpcms注册 则UCenter、phpsso、phpcms存在用户数据 无法同步到discuz中 需要在discuz也登陆一次。

phpsso同步登陆流程

1、【phpcms】 获取本地数据库登录用户的phpssouid

2、【phpcms】 通过socket调用phpsso_api_url/index.php?m=phpsso&c=index&a=synlogin发送请求 请求参数为phpssouid的值

3、【phpsso_server】 使用socket访问UC_API/index.php m=user a=synlogin

4、【uc_server】 生成 uc_server项目/data/cache/apps.php 中 <script src="['url']/api/['apifilename'] 默认为:uc.php + 参数">

5、【discuz/uc_client】 被['url']/api/uc.php访问 用于设置cookie

【存在其他phpcms】

6、【phpsso_server】 生成 使用socket访问applist.cache.php中 <script src="['url']/api.php?op=phpsso + action=synlogin">

7、【其他phpcms/api.php】 被['url']/api.php?op=phpsso访问 用于设置cookie

8、【phpcms】 生成cookie

9、【phpcms】 使用生成的script标签用于在不同域中生成cookie

phpsso同步退出流程

1、【phpcms】 通过socket调用phpsso_api_url/index.php?m=phpsso&c=index&a=synlogout发送请求

2、【phpsso_server】 通过socket调用UC_API/index.php m=user a=synlogout 模块

3、【uc_server】 生成 uc_server项目/data/cache/apps.php 中 <script src="['url']/api/['apifilename'] 默认为:uc.php + 参数">

4、【discuz/uc_client】 被['url']/api/uc.php访问 用于清除cookie

【存在其他phpcms】

5、【phpsso_server】 生成 使用socket访问applist.cache.php中 <script src="['url']/api.php?op=phpsso + 参数">

6、【其他phpcms/api.php】 被['url']/api.php?op=phpsso访问 用于清除cookie

7、【phpcms】 生成cookie

8、【phpcms】 使用生成的script标签用于在不同域中清除cookie

discuz注册流程

1、【discuz】 发起向Ucenter的请求 如果discuz项目路径/config/config_ucenter.php内容中的UC_CONNECT是mysql则直接插入Ucenter数据库中 如果UC_CONNECT是api 则 请求地址是:discuz项目路径/config/config_ucenter.php内容中的UC_API.'/index.php?'.'m=user&a=register'

2、【uc_server】 调用 discuz项目路径/uc_server/control/user.php的onregister方法 向数据库添加用户信息

discuz登录流程

1、【discuz】 发起向Ucenter的请求 请求地址是:discuz项目路径/config/config_ucenter.php内容中的UC_API.'/index.php?'.'m=user&a=synlogin' post参数为通过UC_KEY加密

2、【uc_server】 调用 discuz项目路径/uc_server/control/user.php的onsynlogin方法 获取用户在UCenter中的信息 并使用phpsso配置好的authkey加密用户信息 设置<script src="$app['url'].'/api/'.$app['apifilename'] 默认为:uc.php.'?time='.$this->time.'&code='加密的用户信息">

3、【phpcms/uc_client】 调用$app['url'].'/api/'.$app['apifilename'] 默认为:uc.php 设置cookie

4、【discuz】 生成cookie

5、【discuz】 使用生成的script标签用于在不同域中设置cookie 

discuz退出流程

1、【discuz】 发起向Ucenter的请求 请求地址是:discuz项目路径/config/config_ucenter.php内容中的UC_API.'/index.php?'.'m=user&a=synlogout' post参数为通过UC_KEY加密

2、【uc_server】 调用 discuz项目路径/uc_server/control/user.php的onsynlogout方法 获取用户在UCenter中的信息 并使用phpsso配置好的authkey加密用户信息 设置<script src="$app['url'].'/api/'.$app['apifilename'] 默认为:uc.php.'?time='.$this->time.'&action=synlogout">

3、【phpcms/uc_client】 调用$app['url'].'/api/'.$app['apifilename'] 默认为:uc.php 清除cookie

4、【discuz】 清除cookie

5、【discuz】 使用生成script标签用于在不同域中设置cookie 

同步退出时遇到的问题 phpcms安装路径\phpcms\modules\member\classes\client.class.php中的ps_member_synlogout()方法应改为

public function ps_member_synlogout() {

return $this->_ps_send('synlogout', array('1'));

}

因为 phpcms安装路径\phpsso_server\phpcms\modules\phpsso\classes\phpsso.class.php类会判断你发送的数据是否为空 如果为空则exit(0);所以要给传一个非空数组

discuz无法同phpcms同步

原因

function uc_user_synlogin($uid) {

$uid = intval($uid);

if(@include UC_ROOT.'./data/cache/apps.php') {

if(count($_CACHE['apps']) > 1) { // 修改为 count($_CACHE['apps'])>0 

$return = uc_api_post('user', 'synlogin', array('uid'=>$uid));

} else {

$return = '';

}

}

return $return;

}

同时修改

 1、找到discuz目录下 template\default\member\login.htm,删除

οnsubmit="{if$this->setting['pwdsafety']}pwmd5('password3_$loginhash');{/if}pwdclear =1;ajaxpost('loginform_$loginhash', 'returnmessage_$loginhash','returnmessage_$loginhash', 'onerror');return false;"

2、找到discuz目录下/source/function/function_message.php ,查找

$param['header'] = true;

  替换为

$param['header'] = false;