php - Iniciar sesión en Joomla 1.5 Usar formulario externo(no en la carpeta joomla, pero en el mismo servidor)
forms login (3)
Actualmente tengo una instalación de Joomla 1.5, así como otro sitio web. Ambos residen en el mismo servidor web. Sin embargo, están en diferentes carpetas dentro del directorio wwwroot. Me gustaría colocar un formulario de inicio de sesión dentro del sitio web no joomla, que registrará el usuario en Joomla. Ya he intentado copiar y pegar el código de formulario de inicio de sesión de Joomla en una página en el sitio que no es joomla, y todo funciona bien hasta que el valor secreto del formulario no sea correcto. Cualquier ayuda es muy apreciada.
EDITAR: Aquí está el código-
Formulario de contacto:
<!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>
Script de inicio de sesión:
<?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);
?>
Ok, para que esto funcione aquí es lo que hay que hacer,
- Crea una nueva sesión y obtén el token asociado
- Pase el nombre de usuario, la contraseña y el token para crear una sesión iniciada
- Obtenga los nuevos valores de cookies para la sesión iniciada
- Transfiere la cookie al navegador
Aquí está el código necesario para lograr todo esto:
<?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]);
?>
Esto debería funcionar en cualquier sitio web de Joomla, siempre que la URL utilizada en el script tenga un formulario de inicio de sesión en la página. Una vez que ejecute este script, podrá acceder al sitio web e iniciar sesión.
Lo hice funcionar de una manera diferente (después de un día de volver a escribir el código y probar cosas diferentes). Antes que nada, asegúrate de que el archivo php esté en tu directorio raíz de Joomla. Si token e inicia sesión pero su navegador no obtiene la cookie, coloque el código de la cookie ANTES del código postal. Hizo eso y funciona bien. Gracias de nuevo Brent por la ayuda.
<?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);
?>
No funciona porque Joomla requiere un token único con cada solicitud de inicio de sesión. Genera un nuevo token cada vez que crea un formulario de inicio de sesión y ese token se asocia con la sesión del usuario. Para que su inicio de sesión funcione, tendrá que crear una nueva sesión y extraer el token asociado para enviarlo junto con su formulario. Hubo una pregunta similar hace un tiempo que tiene algunas buenas respuestas sobre cómo establecer la sesión y obtener el token.