ti-enxame.com

Login remoto usando cURL

Estou tentando logar um usuário que foi autenticado em outro lugar no site Joomla e estava seguindo o programa Brent Friar Nice, mas teve que aplicar duas modificações:

  1. adicionou um campo "return" que estava contido no formulário
  2. refazer com_users, não com_user

Não sei se esse site tem personalizações específicas, se usa um módulo de login específico ou se é uma versão diferente - não tenho acesso de administrador ao site, portanto não posso verificar. Agora, meu script está em execução, mas não efetua login no usuário com êxito - ele não recebe um cookie em troca, o que espera.

Em vez disso, o site retorna

HTTP/1.1 100 Continuar

HTTP/1.1 303 Veja outra Data: Qua, 23 de julho de 2014 18:18:25 Servidor GMT: Apache/2.2.22 X-Powered-By: PHP/5.2.17 Localização: http: //www.strassenbau .forum-kundenportal.de/login-erfolgreich Comprimento do conteúdo: 0 Conexão: fechar Tipo de conteúdo: text/html; charset = utf-8

Eu conheço um pouco do Joomla, mas não sei nada sobre as profundezas da comunicação http com ele, então não tenho idéia de qual é o problema aqui.

Aqui está o meu 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]);


?>

Enquanto procurava respostas, encontrei um comentário dizendo que o Joomla agora também usa tokens de sessão, portanto não funcionaria por esse motivo. Alguém pode confirmar essa explicação? Mas como então o logon remoto é tratado nessas situações? Posso resolver o problema implementando meu próprio módulo de login?

3
MBaas

Finalmente, resolvi meu problema usando o AutoLogin-Extension (link morto para o JED removido).

Atualização: isso funcionou bem nos velhos tempos (Joomla 2), mas a extensão parece ter sido retirada, então peço desculpas se a solução não ajudar você nos dias de hoje.

0
MBaas

Para resolver seu problema de autenticação, você pode simplesmente instalar Login IP e habilitar seu IP: http://extensions.joomla.org/search ? q = ip +

PD: Seu preg_match ("/ name = ... pode estar encontrando algum outro elemento, e não apenas o token" return ".

0
Anibal

Você já tentou adicionar

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