最近在整JAVA和UCENTER的東西,受限於項目架構須要,沒法徹底以UCENTER爲中心,因此在對接過程當中遇到了許多不愉快的事情。經歷多番研究,終於解決了其中了兩個大問題,現記錄下來,以備往後查看。php
項目並不要求用戶註冊時填寫email,但UCENTER API要求必須輸入email才能夠經過驗證,不得已必須得修改UCENTER代碼才能繞過。如下是改動的代碼:api
/uc_server/control/user.php 69行:cookie
1 // NOTE: 解決email必須填寫的問題 2 //if(($status = $this->_check_email($email)) < 0) { 3 // return $status; 4 //}
因爲BBS屏蔽了DISCUZ自帶的註冊、登陸、找密等操做,因此必需要實現單點登陸。當中遇到了一個很是蛋疼的問題:主站註冊的帳戶同步到UCENTER以後,UCENTER並不會通知其餘應用,也就是說默認狀況下,其餘應用(包括DISCUZ在內)沒法在新用戶註冊以後當即更新用戶列表。細細研究以後發現,DISCUZ是在本地註冊、登陸等事件中才會與UCENTER同步。這致使了,在主站新註冊的用戶,沒法在BBS單點登陸成功——由於在BBS中根本不存在這個用戶。解決的方法有兩個,一是用戶手工登陸一次BBS,BBS自帶的機制會自動將用戶信息從UCENTER同步過來;二是修改DISCUZ系統代碼,在單點登陸請求時自動同步用戶數據。在權衡了各方面因素以後,決定採用第二套方案。如下是改動的代碼:架構
/api/uc.php 192行:dom
1 // NOTE 解決用戶必須手工登陸1次論壇的問題 2 $member = getuserbyuid($uid, 1); 3 4 if (!$member) { 5 $init_arr = explode(',', $_G['initcredits']); 6 $groupid = $_G['regverify'] ? 8 : $_G['newusergroupid']; 7 8 C::t('common_member')->insert($uid, $get['username'], md5(random(10)), $get['email'], $_G['clientip'], $groupid, $init_arr); 9 10 $member = getuserbyuid($uid, 1); 11 } 12 13 if($member) { 14 dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime); 15 }