rtx登錄內網系統

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章