rtx登录内网系统

公司内部使用rtx进行沟通和交流,经常遇到订餐的问题,用php写了一个订餐系统,实现rtx上点击链接打开系统就自动登录了,无需再次输入用户名和密码。

 

实现的思路,就是在点击链接的时候获取当前rtx的user和sign,拼接成一个url追加至系统访问地址后,系统首页在获取网页参数后,通过ajax请求后台服务,后台服务调用rtx的一个服务,验证签名。如果通过则系统直接让该用户自动登录,前台ajax直接页面进入系统。

 

rtx客户端 –> 带上user & sign访问系统 –> 系统根据参数检验身份并返回结果 –> 处理结果…

 

安装完rtx后,可以在rtx面板上添加一个自定义的按钮,内嵌一个页面。

image

 

假设该页面有如下的一个链接:

   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程序

image

   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!”

posted @ 2012-06-19 20:30  meteoric_cry  阅读(3619)  评论(0编辑  收藏  举报