天天看點

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;