<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>login automático Archives - Pereira, Thiago Santos.</title>
	<atom:link href="https://thiagosantos.com/blog/tag/login-automatico/feed/" rel="self" type="application/rss+xml" />
	<link>https://thiagosantos.com/blog/tag/login-automatico/</link>
	<description>the fun of code.</description>
	<lastBuildDate>Mon, 09 Apr 2012 13:53:27 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5</generator>
	<item>
		<title>Magento login automático</title>
		<link>https://thiagosantos.com/blog/306/php/magento-login-automatico/</link>
					<comments>https://thiagosantos.com/blog/306/php/magento-login-automatico/#comments</comments>
		
		<dc:creator><![CDATA[Pereira, Thiago Santos]]></dc:creator>
		<pubDate>Tue, 27 Mar 2012 18:27:25 +0000</pubDate>
				<category><![CDATA[Ecommerce]]></category>
		<category><![CDATA[Magento]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ecommerce]]></category>
		<category><![CDATA[login automático]]></category>
		<category><![CDATA[magento customer login]]></category>
		<guid isPermaLink="false">http://thiagosantos.com/blog/?p=306</guid>

					<description><![CDATA[<p>O login automático é uma solução para desenvolvedores, mantenedores e proprietários de ecommerce Magento que querem dar uma melhor experiência para seus usuários. Vale a pena dar uma lida, e mais a pena ainda comentarem.</p>
<p>The post <a href="https://thiagosantos.com/blog/306/php/magento-login-automatico/">Magento login automático</a> appeared first on <a href="https://thiagosantos.com/blog">Pereira, Thiago Santos.</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span style="color: #3366ff;"><strong>1. Introdução</strong></span></p>
<p>Construindo um modulo para carrinho abandonado no Magento me deparei com a seguinte situação:</p>
<ol>
<li>O usuário recebe no email uma cópia do carrinho que ele abandonou</li>
<li>Ele se interessa novamente pelos produtos, clica no email</li>
<li>É então direcionado para a página de login do Magento</li>
<li>Digita usuário e senha, e é direcionado para a home, ou para a minha conta (varia de acordo com as configurações do admin)</li>
<li>Depois o usuário tem que se dar ao trabalho de ir para o página do carrinho (checkout/cart)</li>
<li>E dai então continuar com o processo</li>
</ol>
<div>São 6 passos para que o cliente tem que seguir para continuar com a compra que ele havia abandonado uma vez.</div>
<div>Achei tudo muito complicado. O usuário já se interessar pelo carrinho que ele abandonou já seria um grande lucro, então vamos facilitar.</div>
<div>Pensando nisso criei uma proposta para diminuir de 6 passos para apenas 4, removendo os passos mais entediantes logar e direcionar o usuário pro carrinho. A proposta é que após receber o carrinho abandonado por e-mail o cliente entre direto na página do carrinho já logado. Os passos são descritos abaixo:</div>
<div>
<ol>
<li>O usuário recebe no email uma cópia do carrinho que ele abandonou</li>
<li>Ele se interessa novamente pelo produtos, clica no email</li>
<li>É então direcionado para uma página onde seu usuário é autenticado, e então automaticamente redirecionado para para a página do carrinho já logado.</li>
<li>Se necessário modificar o carrinho e continuar com o processo<br />
<span id="more-306"></span></li>
</ol>
<div>[Um ponto que seria interessante de estudar é a eficacia de direcionar o usuário para a página do carrinho e para a página de checkout, fica ai a dica para os curiosos.]</div>
</div>
<div><strong><span style="color: #3366ff;">2. Criptografia</span></strong></div>
<div>Tive que bolar um jeito de conseguir passar uma string com um identificador único do usuário através dos parametro GET no email dele. O Magento disponibiliza o &#8220;core/encryption&#8221; capaz de criptografar e descriptografar uma string qualquer. O legal disso é a string que criptografar com a minha instalação será diferente da sua, mesmo se passarmos exatamente os mesmos valores. Isso porque o Magento usa os dados do &#8220;crypt key&#8221; definida no momento da instalação.</div>
<div>De forma prática:</div>
<pre lang="php">$crypt = Mage::getModel('core/encryption');
echo $crypt-&gt;encrypt("thiagão_boladão");</pre>
<pre lang="php">[retornos]
Magento 1: tDxa5XdEj6easqHi2pglwF/eQYKimNNJ
Magento 2: 5skpZoWseMKdMgd/aOMLrXSVhLebaMUa</pre>
<p>Em duas instalações diferentes do Magento, obtive duas saídas diferentes. Isso torna a criptografia mais segura, mas não a prova de quebras. Foco no login automático!</p>
<p><strong><span style="color: #3366ff;">3. Decriptografia</span></strong></p>
<p>Da mesma forma que criptografamos a informação é possível também descriptografar obtendo a mesma sentença inicial da forma que se segue.</p>
<pre lang="php">$crypt = Mage::getModel('core/encryption');
echo $crypt-&gt;decrypt("5skpZoWseMKdMgd/aOMLrXSVhLebaMUa");</pre>
<pre lang="php">[retornos]
Magento 1: i������o�Ǻ��f2g�
Magento 2: thiagão_boladão</pre>
<p><span style="color: #3366ff;"><strong><br />
4. Cryptografando e montando a URL</strong></span></p>
<p>O meu objetivo é criar um link que é enviado para o usuário contendo id do usuário como parametro, fácil de identificar quando tivermos o retorno, seu email ( para checarmos a autenticidade do link) e uma data de expiração tudo criptografado em um link. oO</p>
<p>Ao invés de o link ser ao do tipo:<br />
<em>http://meumagento.com.br/meucontroller/loga/?id=1&amp;email=5&amp;expira=2121214578</em> seria algo do tipo:<br />
<em>http://meumagento.com.br/meucontroller/loga/?c=5skpZoWseMKdMgd/aOVhLebaUa .</em></p>
<p>Pensei em concaternar os dados ao invés de cada dado ser um parâmetro diferente. Por tanto vou usar os dados concatenados separados por ponto e virgula (;). Assim no primeiro parametro fica o id, no segundo fica o email do usuário e no terceiro a data de validade do link:</p>
<p>ID do usuário; email do usuário; data de expiração do link</p>
<p>Passando isso pra código seria algo assim:</p>
<pre lang="php">$crypt = Mage::getModel('core/encryption');
$customer = Mage::getModel('customer/customer')-&gt;load(3);
//validade do link é de 48 horas
$timeout = time()+(60*60)*48;
$_crypted = $crypt-&gt;encrypt(
                            $customer-&gt;getId().";".
                            $customer-&gt;getEmail().";".
                            $timeout
                           );
//link
echo Mage::getUrl('meucontroller/loga', array('c' =&gt; $_crypted));</pre>
<pre lang="php">[deve ficar algo assim]
http://meumagento.com.br/meumodulo/meucontroller/loga/index/c/XvCfxYRNKYI9OsYPil1FgsDoi7x52+RaUdj4QoLHAaw=/</pre>
<p>Bem legal né?<br />
Só que se avaliarmos o nosso parametro c, vamos ver que há um &#8220;=&#8221; e um &#8220;+&#8221; na string, então pra não corremos o risco de uma deformação na nossa string antes de montar a url, vou colocar o url_encode. Ficando assim:</p>
<p>&nbsp;</p>
<pre lang="php">$crypt = Mage::getModel('core/encryption');
$customer = Mage::getModel('customer/customer')-&gt;load(3);
//validade do link é de 48 horas
$timeout = time()+(60*60)*48;
$_crypted = $crypt-&gt;encrypt(
                            $customer-&gt;getId().";".
                            $customer-&gt;getEmail().";".
                            $timeout
                           );
//link
echo Mage::getUrl('meucontroller/loga',
                   array('c' =&gt; url_encode($_crypted))
                  );</pre>
<pre lang="php">[deve ficar algo assim]
http://meumagento.com.br/meumodulo/meucontroller/loga/index/c/XvCfxYRNKYI9OsYPil1FgsDoi7x52%2BRavxAgdhTuSOI%3D/</pre>
<p>Só não podemos deixar de decodificar depois &#8230; :)<br />
Basicamente é isso fechamos essa etapa, temos ao final uma url com 3 parâmetros codificados e criptografados que será enviado pro usuário.</p>
<p><strong><span style="color: #3366ff;">5. Controller e a volta</span></strong></p>
<p>A volta é bem simples, com os conceitos de criptografar e decriptografar descritos a cima fica facil daqui em diante. O cliente acabou de clicar sobre o link que foi enviado e em seguida ele é direcionado para o seu controller &#8220;MeuController&#8221; no metodo &#8220;logaAction&#8221;. Esse post já está enorme, então vou me limitar ao metodo.</p>
<pre lang="php">public function logaAction(){

    $parametro = $this-&gt;getRequest()-&gt;getParam('c');
    $session = Mage::getSingleton('customer/session');

    if (!isset($parametro )) {
        $session-&gt;addError('URL inválida ou usuário inexistente.');
        $this-&gt;_redirect('/');
    }
    //0 - id //1 - email //2 - data de expiracao
    $csv = Mage::helper('carrinhoabandonado')-&gt;decrypt($parametro );
    $_customerinfo = explode(';', $csv);

    //ID do usuário
    $customerid = $_customerinfo[0];
    //email do usuário
    $customermemail = $_customerinfo[1];
    //Data de expiração do link
    $exp = $_customerinfo[2];

    //primeira coisa a ser feita aqui é validar a data do link
    if(time()&gt;$exp){
        $session-&gt;addError('URL inválida ou usuário inexistente.');
        $this-&gt;_redirect('/');
    }
    //Usuário existe?
    $customer = Mage::getModel('customer/customer')-&gt;load($customerid);
    if(!$customer-&gt;getId()){
        $session-&gt;addError('URL inválida ou usuário inexistente.');
        $this-&gt;_redirect('/');

    }
    //Data ok, usuário existe, validar o email do banco com o do parametro
    if($customer-&gt;getEmail() != $customeremail){
        $session-&gt;addError('URL inválida ou usuário inexistente.');
        $this-&gt;_redirect('/');
   }

   //Tudo OK!
   $session-&gt;logout();
   //Logando o usuário
   $session-&gt;setCustomer($customer);

   $this -&gt; _redirect('/');
}</pre>
<p>Auto explicativo?</p>
<p>Comentem e vamos fazer desde um post mais completo!</p>
<p>Quem quiser dar uma olhada no meu modulo de carrinho abandonado, e quiser fazer alguns relatórios :). Ele ta lá no <a title="Carrinho Abandonado" href="https://github.com/thiagosantos/Carrinho-Abandonado---Magento">GitHub</a> (<a href="https://github.com/thiagosantos/Carrinho-Abandonado---Magento">https://github.com/thiagosantos/Carrinho-Abandonado&#8212;Magento</a>). Para esse post usei parte de código do Carrinho Abandonado, mas a versão do post está bem explicado.</p>
<p><em>atualizado:</em><br />
<em>[29/03/2012 09:43] </em></p>
<p>The post <a href="https://thiagosantos.com/blog/306/php/magento-login-automatico/">Magento login automático</a> appeared first on <a href="https://thiagosantos.com/blog">Pereira, Thiago Santos.</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://thiagosantos.com/blog/306/php/magento-login-automatico/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
	</channel>
</rss>
