公司內部使用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!”