it-swarm-es.tech

Inicio de sesión remoto con cURL

Estoy intentando iniciar sesión en un usuario que se autenticó en otro lugar en un sitio de Joomla y estaba siguiendo Brent Friar's Buen programa, pero tuvo que aplicar dos modificaciones:

  1. agregó un campo "retorno" que estaba contenido en el formulario
  2. refencing com_users, no com_user

No sé si ese sitio tiene personalizaciones específicas, usa un módulo de inicio de sesión específico o si es una versión diferente; no tengo acceso de administrador al sitio, por lo que no puedo verificarlo. Ahora, mi script se está ejecutando, pero no inicia sesión con éxito en el usuario; no recibe una cookie a cambio que está esperando.

En cambio, el sitio vuelve

HTTP/1.1 100 Continuar

HTTP/1.1 303 Ver otro Fecha: mié, 23 de julio de 2014 18:18:25 Servidor GMT: Apache/2.2.22 X-Powered-By: PHP/5.2.17 Ubicación: http: //www.strassenbau .forum-kundenportal.de/login-erfolgreich Longitud del contenido: 0 Conexión: cerrar Tipo de contenido: texto/html; charset = utf-8

Sé un poco de Joomla, pero no sé nada sobre la profundidad de la comunicación http con él, así que no tengo idea de cuál es el problema aquí.

Aquí está mi código:

<?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';
// edit: using the location of the 303-result directly...but it does not make a difference
curl_setopt($ch, CURLOPT_URL , "http://www.strassenbau.forum-kundenportal.de/login-erfolgreich");
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]);


?>

Mientras buscaba respuestas, encontré un comentario que decía que Joomla ahora también usa tokens de sesión, por lo que no funcionaría por esa razón. ¿Alguien puede confirmar esa explicación? Pero, ¿cómo se maneja el inicio de sesión remoto en tales situaciones? ¿Podría superar el problema implementando mi propio módulo de inicio de sesión?

3
MBaas

Finalmente resolví mi problema usando AutoLogin-Extension (hipervínculo muerto a JED eliminado).

Actualización: eso funcionó bien en los viejos tiempos (Joomla 2), pero la extensión parece haber sido retirada, por lo que me disculpo si la solución no lo ayudará en estos días.

0
MBaas

Para resolver su problema de autenticación, puede instalar IP Login y habilitar su IP: http://extensions.joomla.org/search ? q = ip +

PD: Tu preg_match ("/ name = ... podría estar encontrando algún otro elemento, y no solo el token" return ".

0
Anibal

¿Has intentado agregar

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
0
jdog