从外部脚本登录Joomla

时间:2014-07-23 18:38:00

标签: php curl joomla

我正在尝试将在其他位置经过身份验证的用户登录到Joomla网站,并且正在关注Brent Friar's不错的程序,但必须应用两个修改:

  1. 添加了一个字段“return”,其中包含
  2. 形式
  3. 重新使用com_users,而不是com_user
  4. 我不知道该网站是否有特定的自定义,使用特定的登录模块,或者是否是不同的版本 - 我没有该网站的管理员访问权限,所以我无法检查。 现在,我的脚本正在运行,但是它没有成功登录用户 - 它没有获得它所期望的cookie。

    相反,网站返回

      

    HTTP / 1.1 100继续

         

    HTTP / 1.1 303见其他日期:星期三,23七月2014 18:18:25 GMT服务器:   Apache / 2.2.22 X-Powered-By:PHP / 5.2.17位置:   http://www.strassenbau.forum-kundenportal.de/login-erfolgreich   Content-Length:0连接:close Content-Type:text / html;   字符集= UTF-8

    我对Joomla有点了解,但对它的http通信深度一无所知,所以我不知道这里有什么问题。

    这是我的代码:

    <?php
    
    $uname = "*** secret";
    $upswd = "*** credentials";
    $url = "http://www.strassenbau.forum-kundenportal.de/login-anmeldung";
    set_time_limit(0);
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url );
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE );
    curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE );
    curl_setopt($ch, CURLOPT_COOKIEJAR, realpath('./cookie.txt'));
    curl_setopt($ch, CURLOPT_COOKIEFILE, realpath('./cookie.txt'));
    curl_setopt($ch, CURLOPT_HEADER, TRUE );
    $ret = curl_exec($ch);
    
    if (!preg_match('/name="([a-zA-z0-9]{32})"/', $ret, $spoof)) {
        preg_match("/name='([a-zA-z0-9]{32})'/", $ret, $spoof);
    }
    
    preg_match('/name="return" value="(.*)"/', $ret, $return); // search for hidden field "return" and get its value
    
    // POST fields
    $postfields = array();
    $postfields['username'] = urlencode($uname);
    $postfields['password'] = urlencode($upswd);
    $postfields['option'] = 'com_users';
    $postfields['task'] = 'user.login';
    $postfields['return'] = $return[1];
    $postfields[$spoof[1]] = '1';
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
    $ret = curl_exec($ch);
    
    echo "ret2: <pre>"; var_dump($ret); echo "</pre>";  // no cooking being set here!
    
    // Get logged in cookie and pass it to the browser
    preg_match('/^Set-Cookie: (.*?);/m', $ret, $m);
    $cookie=explode('=',$m[1]);
    setcookie($cookie[0], $cookie[1]);
    
    
    ?>
    

1 个答案:

答案 0 :(得分:0)

我最终使用了完成这项工作的AutoLogin-extension。不像&#34;优雅&#34;正如我想要的那样(因为它需要安装该插件),但是嘿,它有效! : - )