Re: Submeter um formulário remotamente e continuar logado após redirecionamento.

336 views
Skip to first unread message

Tiago Santos

unread,
Dec 23, 2013, 8:28:25 AM12/23/13
to zfbr...@googlegroups.com
esta correto!
a sessão em um dominio não irá persistir sobre a sessão de outro que vc autenticou via curl.
para ter acesso autenticado do browser, para navegar, tu vai ter que submeter o login como se o usuário estivesse acessando mesmo o site.
Viu curl, tu terá um certo trabalho mas nada mt complicado.
Basicamente a ideia é a seguinte:
 - autenticar
 - buscar o necessario
 - efetuar logoff

cada request que tu fizer, tu busca TODA informação que tu precisa e retorna na tela.
digamos que inicialmente tu quer listar para o usuário do domínio "teste.com.br" o que esta no domínio "outroteste.com.br"
tu efetua o login e armazena o handle em uma variavel "$curlHandle = curl_init();"
o resto tu faz igual porem não redireciona, para redirecionar tu pode usar as opções no teu login:
curl_setopt($curlHandle, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, 1);

para fazer outro request tu aproveita o mesmo handle que tu armazenou na variavel quando tu fez o login.
curl_setopt($curlHandle, CURLOPT_URL, 'http://www.outroteste.com.br');
curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array("Content-Type: text/xml; charset=iso-8858-1"));
curl_setopt($curlHandle, CURLOPT_HTTPGET, 1);

para pegar o resultado do request é só executar o curl_exec($curlHandle);

SEMPRE utilizando a mesma sessão que tu autenticou!
no fim faz o logoff.


Sempre que trabalho com isso, eu crio uma função para login, que me retorna o handle e outra para logoff;



Em segunda-feira, 23 de dezembro de 2013 10h37min15s UTC-2, Thiago Pelizoni escreveu:
Colegas, tenho um problema e gostaria de saber se alguém pode me ajudar.

Me foi solicitado implementar uma feature onde, em um determinado site, há um botão onde, após o usuário clicar neste botão, ele é autenticado automaticamente em um outro recurso, de outra URL. Para exemplificar, o usuário está no dominio http://www.teste.com e, quando ele clica em um botão, ele efetua a autenticação no dominio http://www.outroteste.com.  Através do curl eu fiz o seguinte:

        $cookie = $_SERVER['DOCUMENT_ROOT'] . "/../data/cookies.txt";

        $url = "http://www.outroteste.com/login";

        $params = array(
            'email' => 'te...@teste.com.br',
            'senha' => '123456',
        );

        $curl = curl_init();

        curl_setopt($curl, CURLOPT_HTTPHEADER, array("Accept: */*", "Connection: Keep-Alive"));
        curl_setopt($curl, CURLOPT_HEADER, 1);
        curl_setopt($curl, CURLINFO_HEADER_OUT, true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($curl, CURLOPT_COOKIESESSION, 1);
        curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);
        curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));
        curl_setopt($curl, CURLOPT_URL, $url);

        $response = curl_exec($curl);        
        return $this->redirect()->toUrl("http://www.outroteste.com/autenticado");

Se eu der um die($response) eu consigo ver a página ao qual, consegui fazer a autenticação corretamente. Todavia, quando eu clico em algum link, sou redirecionado novamente para a página de login, como se eu não houvera feito a autenticação.

Tentei trabalhar o cookie retornado, atrelando a minha sessão da seguinte maneira: 

        preg_match('/^Set-Cookie:\s*([^;]*)/mi', $response, $matches);
        parse_str($matches[1], $cookies);
        setcookie('BNES_PHPSESSID', $cookies['BNES_PHPSESSID']);

Porém, quando redireciona para o outro domínio, não funciona, conforme citei anteriormente onde, ele simplesmente, retorna a pagina principal de login.

Desta forma, primeiramente gostaria de saber se tal implementação é possível onde, em um determinado dominio ao qual estou, consigo autenticar em outro e manter esta autenticação do usuário sem que ele faça novamente ao ser redirecionado. Se for possível, gostaria da ajuda dos demais.

Desde já, agradeço

Tiago Santos

unread,
Dec 23, 2013, 10:35:05 AM12/23/13
to zfbr...@googlegroups.com
isso Thiago, essa parte que expliquei no email, a sessão com o curl é uma sessão temporária do teu server, a sessão do browser do usuário é outra sessão diferente.
com o curl tu esta utilizando uma sessão diferente, mesmo tu tentando pegar o session id e setando como sessão no browser do usuário, ainda assim o teu acesso esta sendo feito de "lugar" diferente.

Gilton Guma

unread,
Jan 2, 2014, 1:43:25 PM1/2/14
to zfbr...@googlegroups.com
Se este domínio destino não tem nada a ver com o seu domínio, porque não utilizar apenas um formulário de autenticação normal e redirecionar o cliente para o sistema de destino?

Observações:
- Da forma como você está explicando, a sessão está sendo processada no lado servidor (server-side), no entanto deveria estar no lado cliente (cliente-side).
- Uma alternativa é enviar os dados de autenticação para cada requisição.
- Alternativamente, pesquise sobre Active Directory ou LDAP! ;)
Reply all
Reply to author
Forward
Message has been deleted
Message has been deleted
Message has been deleted
0 new messages