В настоящее время у меня есть установка Joomla 1.5, а также другой сайт. Они оба находятся на одном и том же веб-сервере. Однако они находятся в разных папках в каталоге wwwroot. Я хотел бы разместить регистрационную форму на веб-сайте non-joomla, который будет регистрировать пользователя в Joomla. Я уже пробовал копировать и вставлять код формы входа в Joomla на страницу на сайте, отличном от joomla, и все работает отлично до тех пор, пока значение секретной формы не будет правильно. Любая помощь приветствуется.
EDIT: Вот код-
Форма обратной связи:
<!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); ?>
Хорошо, чтобы это работало здесь, что нужно сделать –
Вот код, необходимый для выполнения всего этого:
<?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]); ?>
Это должно работать на любом веб-сайте Joomla, если URL-адрес, используемый в скрипте, имеет форму входа на страницу. После запуска этого скрипта вы сможете получить доступ к веб-сайту и войти в систему.
Он не работает, потому что Joomla требует уникальный токен с каждым запросом на вход. Он генерирует новый токен каждый раз, когда он создает форму входа, и этот токен связан с сеансом пользователя. Чтобы ваш логин работал, вам нужно будет создать новый сеанс и вытащить связанный токен, чтобы отправить его в вашу форму. Некоторое время назад был аналогичный вопрос, в котором есть несколько хороших ответов о том, как установить сеанс и получить токен.
Вход CURL по сценарию на сайт Joomla
У меня это работает по-другому (после того, как я переписал код и пробовал разные вещи). Прежде всего, убедитесь, что файл 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); ?>