Php 使用外部表单登录Joomla 1.5(不在Joomla文件夹内,但在同一服务器上)

Php 使用外部表单登录Joomla 1.5(不在Joomla文件夹内,但在同一服务器上),php,forms,login,joomla,joomla1.5,Php,Forms,Login,Joomla,Joomla1.5,我目前有一个Joomla 1.5安装,以及另一个网站。它们都位于同一个web服务器上。但是,它们位于wwwroot目录中的不同文件夹中。我想在非joomla网站中放置一个登录表单,该表单将用户登录到joomla。我已经尝试过将Joomla登录表单代码复制并粘贴到非Joomla站点的页面中,直到秘密表单值不正确为止,一切都正常。非常感谢您的帮助 编辑: 这是密码- 联络表格: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/

我目前有一个Joomla 1.5安装,以及另一个网站。它们都位于同一个web服务器上。但是,它们位于wwwroot目录中的不同文件夹中。我想在非joomla网站中放置一个登录表单,该表单将用户登录到joomla。我已经尝试过将Joomla登录表单代码复制并粘贴到非Joomla站点的页面中,直到秘密表单值不正确为止,一切都正常。非常感谢您的帮助

编辑: 这是密码-

联络表格:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
</head>

<body>
<form id="login" name="login" method="post" action="login.php">
  <label>
  <input name="username" type="text" id="username" value="username" />
  </label>
    <label>
    <input name="password" type="password" id="password" value="password" />
    </label>
  </p>
  <p>
    <label>
    <input type="submit" name="submit" id="submit" value="Submit" />
    </label>
  </p>
</form>
</body>
</html>

无标题文件

登录脚本:

<?php
$uname = $_POST['username'];
$upswd = $_POST['password'];
$url = "http://www.mywebsite.com/joomla_site/index.php";

$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_COOKIEJAR, './cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, './cookie.txt');
curl_setopt($ch, CURLOPT_HEADER, FALSE );
$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);
}

// POST fields
$postfields = array();
$postfields['username'] = urlencode($uname);
$postfields['passwd'] = urlencode($upswd);
$postfields['lang'] = '';
$postfields['option'] = 'com_login';
$postfields['task'] = 'login';
$postfields[$spoof[1]] = '1';
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
$ret = curl_exec($ch);
?>

它不起作用,因为Joomla在每个登录请求中都需要一个唯一的令牌。每次创建登录表单时,它都会生成一个新的令牌,并且该令牌与用户会话相关联。为了让您的登录工作,您必须创建一个新会话,并提取相关联的令牌与表单一起提交。不久前有一个类似的问题,关于如何建立会话和获取令牌,有一些很好的答案


好的,为了使这项工作正常进行,这里需要做的是-

  • 创建新会话并获取关联的令牌
  • 传递用户名、密码和令牌以创建登录会话
  • 获取登录会话的新cookie值
  • 将cookie传输到浏览器
  • 以下是完成所有这一切所需的代码:

    <?php
    $uname = $_POST['username'];
    $upswd = $_POST['password'];
    $url = "http://joomla website.com";
    
    $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);
    }
    
    // POST fields
    $postfields = array();
    $postfields['username'] = urlencode($uname);
    $postfields['passwd'] = urlencode($upswd);
    $postfields['option'] = 'com_user';
    $postfields['task'] = 'login';
    $postfields[$spoof[1]] = '1';
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
    $ret = curl_exec($ch);
    
    // 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]);
    ?>
    

    我以不同的方式实现了这一点(在一天的重新编写代码和尝试不同的东西之后)。首先,确保php文件位于根Joomla目录中。如果令牌和登录有效,但您的浏览器未获取cookie,请将cookie代码放在邮政编码之前。这样做了,效果很好。再次感谢布伦特的帮助

    <?php
    $uname = $_GET['username'];
    $upswd = $_GET['password'];
    $url = "http://www.myJoomlaSite.com";
    
    $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);
    }
    
    // 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]);
    
    // POST fields
    $postfields = array();
    $postfields['username'] = urlencode($uname);
    $postfields['passwd'] = urlencode($upswd);
    $postfields['option'] = 'com_user';
    $postfields['task'] = 'login';
    $postfields[$spoof[1]] = '1';
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
    $ret = curl_exec($ch);
    ?>
    

    谢谢您的回复。我访问了那个页面,试图使用最后一个答案中的代码。不幸的是,我对php和Joomla都很陌生,而且我很难让代码正常运行。为了使我的登录表单正常工作,我需要做什么或将表单传递给此代码?此时,当我试图在浏览器中单独加载该代码时,我得到一个调用未定义函数error referenced curl_init()。再次感谢您的帮助。我在我的Web服务器上启用了CURL,因此未定义的函数错误不再发生。然而,我仍然无法正确地实现这段代码。我是否需要将信息从我的表单传递到这个代码,或者从这个代码传递到我的表单,然后再传递到Joomla?再次感谢。页面底部的脚本是您提交表单的目的地。您需要将用户名和密码从表单传递到该脚本。然后脚本使用cURL启动一个会话,生成并检索令牌,然后将包括用户名和密码在内的所有信息提交给Joomla。我创建了一个带有用户名字段、密码和提交按钮的登录表单。此表单使用POST将数据发送到该脚本。用户名作为“id”发送,密码作为“pswd”发送。我已将脚本中的url更改为Joomla安装的index.php文件。当我提交表单时,数据会被发送到脚本,但我不确定我是否真的登录了。使用我的表单和此脚本登录后,如果我真的进入我的Joomla站点,它会告诉我我尚未登录,必须登录。如果尚未登录,则需要更改$uname=“id”;至$uname=$_POST['id'];和$upswd=“pswd”;至$upswd=$_POST['pswd'];它工作得很好!非常感谢你的帮助,我真的很感激。我有一个快速跟进的问题。此脚本在我的机器和所有浏览器上都能正常工作,但在某些机器上,此脚本无法让用户正确登录。是否有任何特定的操作系统或浏览器设置会干扰此脚本的操作?关闭cookie将是一个问题,因为这需要cookie将会话传输到浏览器。除此之外,它应该与浏览器无关,一切都发生在服务器端。脚本不错,但我发现您必须去掉用户名和密码周围的urlencode()函数,否则如果用户名或密码包含任何标点字符,它将失败。