公司內部使用rtx進行溝通和交流,經常遇到訂餐的問題,用php寫了一個訂餐系統,實現rtx上點擊鏈接打開系統就自動登錄了,無需再次輸入用戶名和密碼。
實現的思路,就是在點擊鏈接的時候獲取當前rtx的user和sign,拼接成一個url追加至系統訪問地址後,系統首頁在獲取網頁參數後,通過ajax請求後臺服務,後臺服務調用rtx的一個服務,驗證簽名。如果通過則系統直接讓該用戶自動登錄,前臺ajax直接頁面進入系統。
rtx客戶端 –> 帶上user & sign訪問系統 –> 系統根據參數檢驗身份並返回結果 –> 處理結果…
安裝完rtx後,可以在rtx面板上添加一個自定義的按鈕,內嵌一個頁面。
假設該頁面有如下的一個鏈接:
1: <a href="http://192.168.0.xx/" title="xx系統" onclick="xxClickHandler();return false;">◆xx系統</a>
那麼xxClickHandler()函數會在點擊鏈接時,獲取最新的sign,然後打開網頁
1: function xxClickHandler() { 2: var _href = getEl('xxxLink').getAttribute('href', 2); 3: 4: var _str = getXXUrl(); 5: 6: if (_str) { 7: _href += _str; 8: } 9: 10: window.open(_href); 11: } 12: 13: function getXXUrl() { 14: var objKerRoot; 15: var objHelper; 16: var objApp; 17: 18: try { 19: objKerRoot = rtxObj.GetObject("KernalRoot"); 20: objApp = rtxObj.GetObject("AppRoot") 21: objHelper = objApp.GetAppObject("RTXHelper"); 22: } catch(e) { 23: //alert(e.message); 24: return ; 25: } 26: 27: if (objKerRoot != null) { 28: var objBuddyManager = objKerRoot.RTXBuddyManager; 29: var objGroupManager = objKerRoot.RTXGroupManager; 30: var accout = objKerRoot.Account; 31: 32: if(accout != "") { 33: var rtxName = objBuddyManager.Buddy(accout).Name; 34: var groupName = objHelper.GetBuddyDept(accout); 35: var sign = objKerRoot.Sign.GetString("Sign"); 36: 37: var url = "?id=" + accout + '&name=' + escape(rtxName) + "&sign=" + escape(sign); 38: 39: return url; 40: } 41: } 42: }
點擊鏈接時,得到如下的url地址
1: http://192.168.0.xx/?id=123456&name=%xxx%u4E49&sign=xxxxxxxxxxxxxxxxxxxxx/9Hhb4cVmRoe4TNbyiCXPxxxxx%3D
系統獲取參數,然後請求rtx的SignAuth.cgi接口---實際就是一個php程序
1: <?PHP 2: 3: $user = $_GET["user"]; 4: $sign = $_GET["sign"]; 5: 6: try 7: { 8: 9: $RootObj= new COM("RTXSAPIRootObj.RTXSAPIRootObj"); 10: $UserAuth = $RootObj->UserAuthObj; 11: 12: $bisSuccess = $UserAuth->SignatureAuth($user, $sign); //驗證簽名 13: 14: if($bisSuccess) 15: { 16: echo "success!"; 17: } 18: else 19: { 20: echo "failed!"; 21: } 22: 23: } 24: catch (Exception $e) { 25: 26: //有任何其他異常,那麼返回reg_err.php 27: $errstr = $e->getMessage(); 28: $splitstr = explode(':', $errstr, -1); 29: $errstrlast = $splitstr[count($splitstr)-1]; 30: 31: echo $errstrlast; 32: 33: return; 34: } 35: 36: 37: ?>
前臺頁面通過ajax,請求系統的一個接口,該接口去驗證當前rtx的身份,通過則自動登錄系統並返回身份通過的信息,前臺判斷如果通過則跳轉頁面。
後臺驗證身份的php程序代碼:
1: <?php 2: session_start(); 3: 4: date_default_timezone_set("Asia/Shanghai"); 5: 6: require_once 'inc/conn.php'; 7: DBHelper::buildLink(); 8: 9: include 'snoopy/Snoopy.class.php'; 10: $snoopy = new Snoopy(); 11: 12: $sourceURL = $_REQUEST['url']; 13: 14: $snoopy->fetch($sourceURL); 15: 16: $rs = mb_convert_encoding($snoopy->results, "utf-8", "GBK"); 17: 18: if ($rs == "success!") { 19: $uin = $_REQUEST['user']; 20: 21: $sql = "select * from user_info where userid='$uin'"; 22: 23: DBHelper::query($sql, function($result, $len) { 24: 25: if ($len == 1) { 26: $row = mysqli_fetch_array($result); 27: //設置session和cookie 28: setcookie("xxx_uname", $upt, time()+10000*10000, "/", $_SERVER["HTTP_HOST"]); 29: } 30: }); 31: 32: echo "{code:'0', msg:''}"; 33: } else { 34: echo "{code:'1', msg:'登錄失敗~'}"; 35: } 36: 37: ?>
不過實際應用起來,感覺並不穩定,也就是驗證sign的接口,有時候返回失敗的信息,正常的情況下是直接返回”success!”