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:
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?
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.
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 ".
Você já tentou adicionar
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);