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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java后端技术

GitLab配置ssh key

  当前很多公司都选择git作为代码版本控制工具,然后自己公司搭建私有的gitlab来管理代码,我们在clone代码的时候可以选择http协议,当然我们亦可以选...

13530
来自专栏地方网络工作室的专栏

Shell 命令行实现将一个站点页面全部下载到本地并替换其中链接的脚本

Shell 命令行实现将一个站点页面全部下载到本地并替换其中链接的脚本 不知道为什么,我总想用 Shell 脚本来实现把一个站点内容给下载下来。但是下载什么站点...

21650
来自专栏开源优测

[快学Python3]开发工具

Python有丰富的开发工具,本书不一一进行介绍,只推荐大家使用PyCharm,本书接下来章节的示例代码均基于PyCharm社区版进行演示。 下载 下载地址: ...

33570
来自专栏守望轩

Visual Studio 2008 每日提示(二十四)

#231、如何找到最后一次设置的环境保存的位置? 原文链接:Did you know… How to find what development settin...

37970
来自专栏互联网软件技术

wangEditor-基于javascript和css开发的 Web富文本编辑器, 轻量、简洁、易用、开源免费(2)

17840
来自专栏finleyMa

SSH 技巧

SSH 是 Linux 下进行远程连接的基本工具。 一般情况下我们可以通过 ssh username@xxx.xxx.xxx.xxx 登录远程服务器,如果要管...

33230
来自专栏玄魂工作室

Hacker基础之Linux篇:基础Linux命令三

我们继续学习Linux 1. find find命令用来在指定目录下查找文件,任何位于参数之前的字符串都将被视为欲查找的目录名。 如果使用该命令时,不设置任何参...

30460
来自专栏linux运维学习

linux学习第四十二篇:限定某个目录禁止解析php, 限制user_agent,PHP相关配置

限定某个目录禁止解析php 虚拟主机配置文件添加的核心配置内容: <Directory /data/wwwroot/111.com/upload> ...

26790
来自专栏Coding迪斯尼

java开发操作系统:一个程序向另一个程序伸出的咸猪手

17940
来自专栏开源优测

AutoLine源码之RobotFramework运行器

在AutoLine中我们自定义实现了RobotFramework的运行器,其路径如下图所示:

14330

扫码关注云+社区

领取腾讯云代金券