discuz社区与java web的钉钉手机版整合(一)

在前面的博文中,我已经完成了discuz与java web在浏览器上的整合,大概原理是利用ucernter作为中介,在java web中登录时,调用uc_user_login()登录,这时候就会返回一段js代码把cookie写在浏览器中,使得两个系统公用相同的cookie以达到同步登录的目的。

我们都知道,很多公司都用使用阿里的钉钉作为办公通讯工具。那么这篇将介绍如何使用融合discuz,java web,钉钉的同步登录!

         一、首先先看看钉钉与discuz的整合:

由于钉钉的微应用是根据url去访问的,所以原理是:在url给discuz传送key值和uid的值,discuz服务端在获取key值后知道是钉钉应用的访问,再根据uid判断是哪位用户登录。那么我们需要做的是

1.如何绕开discuz的登录验证。

首先,我们先了解discuz的源码目录框架,在上一篇我转载了别人介绍的目录框架。找到根目录的menber代码:

[java]  view plain  copy
  1. <?php  
  2.   
  3. /** 
  4.  *      [Discuz!] (C)2001-2099 Comsenz Inc. 
  5.  *      This is NOT a freeware, use is subject to license terms 
  6.  * 
  7.  *      $Id: member.php 24411 2011-09-19 05:09:03Z monkey $ 
  8.  */  
  9.   
  10. define('APPTYPEID'0);  
  11. define('CURSCRIPT''member');  
  12.   
  13. require './source/class/class_core.php';  
  14.   
  15. $discuz = C::app();  
  16.   
  17. $modarray = array('activate''clearcookies''emailverify''getpasswd',  
  18.     'groupexpiry''logging''lostpasswd',  
  19.     'register''regverify''switchstatus');  
  20.   
  21.   
  22. $mod = !in_array($discuz->var['mod'], $modarray) && (!preg_match('/^\w+$/', $discuz->var['mod']) || !file_exists(DISCUZ_ROOT.'./source/module/member/member_'.$discuz->var['mod'].'.php')) ? 'register' : $discuz->var['mod'];  
  23.   
  24. define('CURMODULE', $mod);  
  25.   
  26. $discuz->init();  
  27. if($mod == 'register' && $discuz->var['mod'] != $_G['setting']['regname']) {  
  28.     showmessage('undefined_action');  
  29. }  
  30.   
  31.   
  32. require libfile('function/member');  
  33. require libfile('class/member');  
  34. runhooks();  
  35.   
  36.   
  37. require DISCUZ_ROOT.'./source/module/member/member_'.$mod.'.php';  
  38.   
  39. ?>  
粗略地阅读代码,我们发觉,他是根据mod值来判断用户的操作是login,并且引入function/member,class/class_member和/source/module/member/member_ligin.php。于是我们找啊找,确定class_member.php的on_login()函数是用来处理登录的函数。问题来了,这一大 篇幅的东东怎样知道他如何运行?这里我有一个小技巧:利用showmessage()函数来作为断点判断它运行到哪一步,这样就能很好地了解它的运行逻辑了。代码如下:自己对比源代码(discuzX2.5)找亮点

[java]  view plain  copy
  1. function on_login() {  
  2.           
  3.         global $_G;  
  4.         if($_G['uid']) {  
  5.             $referer = dreferer();  
  6.             $ucsynlogin = $this->setting['allowsynlogin'] ? uc_user_synlogin($_G['uid']) : '';  
  7.             $param = array('username' => $_G['member']['username'], 'usergroup' => $_G['group']['grouptitle'], 'uid' => $_G['member']['uid']);  
  8.             showmessage('login_succeed', $referer ? $referer : './', $param, array('showdialog' => 1'locationtime' => true'extrajs' => $ucsynlogin));  
  9.         }  
  10.           
  11.         $from_connect = $this->setting['connect']['allow'] && !empty($_GET['from']) ? 1 : 0;  
  12.         $seccodecheck = $from_connect ? false : $this->setting['seccodestatus'] & 2;  
  13.         $seccodestatus = !empty($_GET['lssubmit']) ? false : $seccodecheck;  
  14.         $invite = getinvite();  
  15.         //1. edit && $_GET['app'] != "ding"  
  16.         if(!submitcheck('loginsubmit'1, $seccodestatus) && $_GET['app'] != "ding") {  
  17.           
  18.                     //showmessage("11111");//--------------------------------------------  
  19.                   
  20.             $auth = '';  
  21.             $username = !empty($_G['cookie']['loginuser']) ? dhtmlspecialchars($_G['cookie']['loginuser']) : '';  
  22.   
  23.             if(!empty($_GET['auth'])) {  
  24.                 list($username, $password, $questionexist) = explode("\t", authcode($_GET['auth'], 'DECODE'));  
  25.                 $username = dhtmlspecialchars($username);  
  26.                 $auth = dhtmlspecialchars($_GET['auth']);  
  27.             }  
  28.   
  29.             $cookietimecheck = !empty($_G['cookie']['cookietime']) || !empty($_GET['cookietime']) ? 'checked="checked"' : '';  
  30.   
  31.             if($seccodecheck) {  
  32.                 $seccode = random(61) + $seccode{0} * 1000000;  
  33.             }  
  34.   
  35.             if($this->extrafile && file_exists($this->extrafile)) {  
  36.                 require_once $this->extrafile;  
  37.             }  
  38.   
  39.             $navtitle = lang('core''title_login');  
  40.             include template($this->template);  
  41.   
  42.         } else {  
  43.             <span style="color:#ff0000;">//钉钉登录的处理函数在这里----------------------------------------------  
  44.             if($_GET['app'] == "ding" && $_GET['ding_uid'] > 0){  
  45.                     //showmessage("into1");//--------------------------------------------  
  46.                     $result = userlogin1($_GET['ding_uid']);  
  47.                 }else {  // 如果不是</span>  
  48.             if(!empty($_GET['auth'])) {  
  49.                 list($_GET['username'], $_GET['password']) = daddslashes(explode("\t", authcode($_GET['auth'], 'DECODE')));  
  50.             }  
  51.   
  52.             if(!($_G['member_loginperm'] = logincheck($_GET['username']))) {  
  53.                 showmessage('login_strike');  
  54.             }  
  55.             if($_GET['fastloginfield']) {  
  56.                 $_GET['loginfield'] = $_GET['fastloginfield'];  
  57.             }  
  58.             $_G['uid'] = $_G['member']['uid'] = 0;  
  59.             $_G['username'] = $_G['member']['username'] = $_G['member']['password'] = '';  
  60.             if(!$_GET['password'] || $_GET['password'] != addslashes($_GET['password'])) {  
  61.                 showmessage('profile_passwd_illegal');  
  62.             }  
  63.   
  64.             $result = userlogin($_GET['username'], $_GET['password'], $_GET['questionid'], $_GET['answer'], $this->setting['autoidselect'] ? 'auto' : $_GET['loginfield'], $_G['clientip']);  
  65.                 } // end else  
  66.             $uid = $result['ucresult']['uid'];  
  67.   
  68.             if(!empty($_GET['lssubmit']) && ($result['ucresult']['uid'] == -3 || $seccodecheck)) {  
  69.                 $_GET['username'] = $result['ucresult']['username'];  
  70.                 $this->logging_more($result['ucresult']['uid'] == -3);  
  71.             }  
  72.   
  73.             if($result['status'] == -1) {  
  74.                 if(!$this->setting['fastactivation']) {  
  75.                     $auth = authcode($result['ucresult']['username']."\t".FORMHASH, 'ENCODE');  
  76.                     showmessage('location_activation''member.php?mod='.$this->setting['regname'].'&action=activation&auth='.rawurlencode($auth).'&referer='.rawurlencode(dreferer()), array(), array('location' => true));  
  77.                 } else {  
  78.                     $init_arr = explode(',', $this->setting['initcredits']);  
  79.                     $groupid = $this->setting['regverify'] ? 8 : $this->setting['newusergroupid'];  
  80.   
  81.                     C::t('common_member')->insert($uid, $result['ucresult']['username'], md5(random(10)), $result['ucresult']['email'], $_G['clientip'], $groupid, $init_arr);  
  82.                     $result['member'] = getuserbyuid($uid);  
  83.                     $result['status'] = 1;  
  84.                 }  
  85.             }  
  86.   
  87.             if($result['status'] > 0) {  
  88.                 //showmessage("1111111111");//--------------------------------------------------------  
  89.                 if($this->extrafile && file_exists($this->extrafile)) {  
  90.                     require_once $this->extrafile;  
  91.                 }  
  92.   
  93.                 setloginstatus($result['member'], $_GET['cookietime'] ? 2592000 : 0);  
  94.                 checkfollowfeed();  
  95.   
  96.                 if($_G['member']['lastip'] && $_G['member']['lastvisit']) {  
  97.                     dsetcookie('lip', $_G['member']['lastip'].','.$_G['member']['lastvisit']);  
  98.                 }  
  99.                 C::t('common_member_status')->update($_G['uid'], array('lastip' => $_G['clientip'], 'lastvisit' =>TIMESTAMP, 'lastactivity' => TIMESTAMP));  
  100.                 $ucsynlogin = $this->setting['allowsynlogin'] ? uc_user_synlogin($_G['uid']) : '';  
  101.   
  102.                 if($invite['id']) {  
  103.                     $result = C::t('common_invite')->count_by_uid_fuid($invite['uid'], $uid);  
  104.                     if(!$result) {  
  105.                         C::t('common_invite')->update($invite['id'], array('fuid'=>$uid, 'fusername'=>$_G['username']));  
  106.                         updatestat('invite');  
  107.                     } else {  
  108.                         $invite = array();  
  109.                     }  
  110.                 }  
  111.                 if($invite['uid']) {  
  112.                     require_once libfile('function/friend');  
  113.                     friend_make($invite['uid'], $invite['username'], false);  
  114.                     dsetcookie('invite_auth''');  
  115.                     if($invite['appid']) {  
  116.                         updatestat('appinvite');  
  117.                     }  
  118.                 }  
  119.   
  120.                 $param = array(  
  121.                     'username' => $result['ucresult']['username'],  
  122.                     'usergroup' => $_G['group']['grouptitle'],  
  123.                     'uid' => $_G['member']['uid'],  
  124.                     'groupid' => $_G['groupid'],  
  125.                     'syn' => $ucsynlogin ? 1 : 0  
  126.                 );  
  127.   
  128.                 $extra = array(  
  129.                     'showdialog' => true,  
  130.                     'locationtime' => true,  
  131.                     'extrajs' => $ucsynlogin  
  132.                 );  
  133.   
  134.                 $loginmessage = $_G['groupid'] == 8 ? 'login_succeed_inactive_member' : 'login_succeed';  
  135.   
  136.                 $location = $invite || $_G['groupid'] == 8 ? 'home.php?mod=space&do=home' : dreferer();  
  137.                 if(empty($_GET['handlekey']) || !empty($_GET['lssubmit'])) {  
  138.                     if(defined('IN_MOBILE')) {  
  139.                         showmessage($loginmessage, $location, $param, array('location' => true));  
  140.                     } else {  
  141.                         if(!empty($_GET['lssubmit'])) {  
  142.                             if(!$ucsynlogin) {  
  143.                                 $extra['location'] = true;  
  144.                             }  
  145.                             showmessage($loginmessage, $location, $param, $extra);  
  146.                         } else {  
  147.                             $href = str_replace("'""\'", $location);  
  148.                             showmessage('location_login_succeed', $location, array(),  
  149.                                 array(  
  150.                                     'showid' => 'succeedmessage',  
  151.                                     'extrajs' => '<script type="text/javascript">'.  
  152.                                         'setTimeout("window.location.href =\''.$href.'\';", 3000);'.  
  153.                                         '$(\'succeedmessage_href\').href = \''.$href.'\';'.  
  154.                                         '$(\'main_message\').style.display = \'none\';'.  
  155.                                         '$(\'main_succeed\').style.display = \'\';'.  
  156.                                         '$(\'succeedlocation\').innerHTML = \''.lang('message', $loginmessage, $param).'\';</script>'.$ucsynlogin,  
  157.                                     'striptags' => false,  
  158.                                     'showdialog' => true  
  159.                                 )  
  160.                             );  
  161.                         }  
  162.                     }  
  163.                 } else {  
  164.                     showmessage($loginmessage, $location, $param, $extra);  
  165.                 }  
  166.             } else {  
  167.                 $password = preg_replace("/^(.{".round(strlen($_GET['password']) / 4)."})(.+?)(.{".round(strlen($_GET['password']) / 6)."})$/s""\\1***\\3", $_GET['password']);  
  168.                 $errorlog = dhtmlspecialchars(  
  169.                     TIMESTAMP."\t".  
  170.                     ($result['ucresult']['username'] ? $result['ucresult']['username'] : $_GET['username'])."\t".  
  171.                     $password."\t".  
  172.                     "Ques #".intval($_GET['questionid'])."\t".  
  173.                     $_G['clientip']);  
  174.                 writelog('illegallog', $errorlog);  
  175.                 loginfailed($_GET['username']);  
  176.                 $fmsg = $result['ucresult']['uid'] == '-3' ? (empty($_GET['questionid']) || $answer == '' ? 'login_question_empty' : 'login_question_invalid') : 'login_invalid';  
  177.                 if($_G['member_loginperm'] > 1) {  
  178.                     showmessage($fmsg, '', array('loginperm' => $_G['member_loginperm'] - 1));  
  179.                 } elseif($_G['member_loginperm'] == -1) {  
  180.                     showmessage('login_password_invalid');  
  181.                 } else {  
  182.                     showmessage('login_strike');  
  183.                 }  
  184.             }  
  185.   
  186.         }  
  187.   
  188.     }  

然后 在function的的function/function_menber.php中根据userlogin()的代码加入钉钉认证的userlogin1()

[java]  view plain  copy
  1. //钉钉认证   
  2. function userlogin1($uid) {  
  3.     $return = array();  
  4.     $member = getuserbyuid($uid, 1);  
  5.       
  6.     $return['member'] = $member;  
  7.     $return['status'] = 1;  
  8.     return $return;  
  9. }  
  10. //end  


加上代码后,就可以用url访问:http://localhost/member.php?mod=logging&action=login&app=ding&ding_uid=9

ok!在浏览器直接输入url,成功登陆,退出再登录,成功!(注意:每次都要退出后再登录)


2.如何绕开discuz的登录验证(根据discuz用户账号)。

上面的1用uid来绕开很方便,用username绕开好像也不难(前提是你熟悉discuz的数据库操作机制)。因为钉钉的接口获取的是username的值(下一篇会讲),所以这里需要根据username来绕开登录验证。于是去找getuserbyusername()的函数,你会发觉找不到,首先这个函数是一开始的时候就通过function_core.php中加载的,在这个函数中却没有getuserbyusername这个函数,于是乎想自己写,但是自己不熟悉php(本人是java程序猿)。耗了很久时间才搞懂里面C::t('common_member_archive')>fetch($uid);意思是从/source/class/table文件夹内的table_common_member_archive.php里面提取fetch的函数。于是乎根据表来找,我们要获取用户的数据,那么就应该通过table_common_member.php这个函数,很惊奇地就会发现里面有fetch_by_username()函数于是乎,一切都迎刃而解!!

总结:

1.C::t('common_member_archive')>fetch($uid);意思是从/source/class/table文件夹内的table_common_member_archive.php里面提取fetch的函数

 2.区table_common_member.php这个函数找相关函数

3.自己组合代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值