Magento login automático

1. Introdução

Construindo um modulo para carrinho abandonado no Magento me deparei com a seguinte situação:

  1. O usuário recebe no email uma cópia do carrinho que ele abandonou
  2. Ele se interessa novamente pelos produtos, clica no email
  3. É então direcionado para a página de login do Magento
  4. Digita usuário e senha, e é direcionado para a home, ou para a minha conta (varia de acordo com as configurações do admin)
  5. Depois o usuário tem que se dar ao trabalho de ir para o página do carrinho (checkout/cart)
  6. E dai então continuar com o processo
São 6 passos para que o cliente tem que seguir para continuar com a compra que ele havia abandonado uma vez.
Achei tudo muito complicado. O usuário já se interessar pelo carrinho que ele abandonou já seria um grande lucro, então vamos facilitar.
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:
  1. O usuário recebe no email uma cópia do carrinho que ele abandonou
  2. Ele se interessa novamente pelo produtos, clica no email
  3. É 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.
  4. Se necessário modificar o carrinho e continuar com o processo
[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.]
2. Criptografia
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 “core/encryption” 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 “crypt key” definida no momento da instalação.
De forma prática:
$crypt = Mage::getModel('core/encryption');
echo $crypt->encrypt("thiagão_boladão");
[retornos]
Magento 1: tDxa5XdEj6easqHi2pglwF/eQYKimNNJ
Magento 2: 5skpZoWseMKdMgd/aOMLrXSVhLebaMUa

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!

3. Decriptografia

Da mesma forma que criptografamos a informação é possível também descriptografar obtendo a mesma sentença inicial da forma que se segue.

$crypt = Mage::getModel('core/encryption');
echo $crypt->decrypt("5skpZoWseMKdMgd/aOMLrXSVhLebaMUa");
[retornos]
Magento 1: i������o�Ǻ��f2g�
Magento 2: thiagão_boladão


4. Cryptografando e montando a URL

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

Ao invés de o link ser ao do tipo:
http://meumagento.com.br/meucontroller/loga/?id=1&email=5&expira=2121214578 seria algo do tipo:
http://meumagento.com.br/meucontroller/loga/?c=5skpZoWseMKdMgd/aOVhLebaUa .

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:

ID do usuário; email do usuário; data de expiração do link

Passando isso pra código seria algo assim:

$crypt = Mage::getModel('core/encryption');
$customer = Mage::getModel('customer/customer')->load(3);
//validade do link é de 48 horas
$timeout = time()+(60*60)*48;
$_crypted = $crypt->encrypt(
                            $customer->getId().";".
                            $customer->getEmail().";".
                            $timeout
                           );
//link
echo Mage::getUrl('meucontroller/loga', array('c' => $_crypted));
[deve ficar algo assim]
http://meumagento.com.br/meumodulo/meucontroller/loga/index/c/XvCfxYRNKYI9OsYPil1FgsDoi7x52+RaUdj4QoLHAaw=/

Bem legal né?
Só que se avaliarmos o nosso parametro c, vamos ver que há um “=” e um “+” 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:

 

$crypt = Mage::getModel('core/encryption');
$customer = Mage::getModel('customer/customer')->load(3);
//validade do link é de 48 horas
$timeout = time()+(60*60)*48;
$_crypted = $crypt->encrypt(
                            $customer->getId().";".
                            $customer->getEmail().";".
                            $timeout
                           );
//link
echo Mage::getUrl('meucontroller/loga',
                   array('c' => url_encode($_crypted))
                  );
[deve ficar algo assim]
http://meumagento.com.br/meumodulo/meucontroller/loga/index/c/XvCfxYRNKYI9OsYPil1FgsDoi7x52%2BRavxAgdhTuSOI%3D/

Só não podemos deixar de decodificar depois … :)
Basicamente é isso fechamos essa etapa, temos ao final uma url com 3 parâmetros codificados e criptografados que será enviado pro usuário.

5. Controller e a volta

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 “MeuController” no metodo “logaAction”. Esse post já está enorme, então vou me limitar ao metodo.

public function logaAction(){

    $parametro = $this->getRequest()->getParam('c');
    $session = Mage::getSingleton('customer/session');

    if (!isset($parametro )) {
        $session->addError('URL inválida ou usuário inexistente.');
        $this->_redirect('/');
    }
    //0 - id //1 - email //2 - data de expiracao
    $csv = Mage::helper('carrinhoabandonado')->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()>$exp){
        $session->addError('URL inválida ou usuário inexistente.');
        $this->_redirect('/');
    }
    //Usuário existe?
    $customer = Mage::getModel('customer/customer')->load($customerid);
    if(!$customer->getId()){
        $session->addError('URL inválida ou usuário inexistente.');
        $this->_redirect('/');

    }
    //Data ok, usuário existe, validar o email do banco com o do parametro
    if($customer->getEmail() != $customeremail){
        $session->addError('URL inválida ou usuário inexistente.');
        $this->_redirect('/');
   }

   //Tudo OK!
   $session->logout();
   //Logando o usuário
   $session->setCustomer($customer);

   $this -> _redirect('/');
}

Auto explicativo?

Comentem e vamos fazer desde um post mais completo!

Quem quiser dar uma olhada no meu modulo de carrinho abandonado, e quiser fazer alguns relatórios :). Ele ta lá no GitHub (https://github.com/thiagosantos/Carrinho-Abandonado—Magento). Para esse post usei parte de código do Carrinho Abandonado, mas a versão do post está bem explicado.

atualizado:
[29/03/2012 09:43] 


Comentários

8 respostas para “Magento login automático”

  1. Avatar de davi reinoldo
    davi reinoldo

    ótimo post!
    vou tentar fazer isso aqui também!!!

    vc explica muito bem

  2. Avatar de Sabrina Bandare
    Sabrina Bandare

    Instalei o módulo da versão 1.6.1.0 e não estou visualizando a possibilidade de configuração em Sistema > Configuração.

    1. Sabrina,
      Esse modulo é totalmente funcional, mas todas as configurações são feitas manualmente dentro do próprio código. Assim não precisa ter uma área pra administrar ele.

      Se você precisar de alguma ajuda pode entrar em contato.

      Abraço,
      ps: pretendo liberar esse mês ainda uma nova atualização pra esse módulo. fica de olho lá no github.

  3. Avatar de Thiago N.
    Thiago N.

    Boa Noite Thiago!!!
    Tenho algumas dúvidas….
    1 – Funciona em 1.7?
    2 – O modulo está funcionando bem para ser usado em uma loja em produção?
    3 – Para instalar é só jogar os arquivos no servidor?

    1. Tudo bom Thiago?

      Você deixou algumas perguntas lá no meu blog com relação ao Login Automatico do Magento, e eu gostaria de esclarer as suas perguntas só que não na mesma ordem que você perguntou.

      2 – O modulo está funcionando bem para ser usado em uma loja em produção?

      O modulo que está no GitHub é um modulo para carrinho abandonado, onde ele dispara diariamente os emails de lembrança do carrinho que foi abandonado pelo cliente. Esse modulo tem suporte a uma implementação que eu fiz de Login Automático. O modulo só de Login Automático, não existe. Mas você pode pegar o código que está no GitHub e fazer a sua implementação.

      Esse modulo é uma primeira versão do sistema de Carrinho Abandonado que fiz para uma empresa, até inicio de agosto o modulo rodava exatamente como está no GitHub. Atualmente existe uma versão mais completa com direito a relatório e mais algumas configurações customizáveis no backend.

      1 – Funciona em 1.7?

      Esse modulo foi desenvolvido especificamente para a versão 1.3 do Magento, já que a empresa faz questão de não atualizar o Magento. Com algumas modificações esse modulo pode sim rodar na versão 1.5 em diante.

      3 – Para instalar é só jogar os arquivos no servidor?

      Se a sua versão for a 1.3, ele deve rodar sem problema, para rodar na 1.7 tem que fazer algumas modificações.

      Deixe me saber mais sobre o que você precisa e vejo se consigo te ajudar.

  4. Thiago show de bola!!!

    Vc saberia como fazer verificação de serial no módulo do Magento, pois pretendo colocar todos os módulos que eu criar como free e opensource, mas para dificultar ações de pessoas que querem vender os módulos, gostaria de colocar em meu site um gerador de key para o domínio e no core do módulo uma validação parecida.

    Eu implementei algo +/- assim que verifica se a key gerada é a string com o nome do domínio que esta instalado o modulo. Mas não sei se é assim que é normalmente feito.

    http://onestepcheckout.com.br/LojaModelo/keygen/

    1. Fala Deivison, tudo bom?

      Eu já pensei bastante sobre as pessoas venderem um modulo que eu desenvolvo gratuitamente e já vi que não é possível controlar isso uma vez que os códigos que produzo são PHP e o código está aberto, a dois cliques e um leitor de texto.

      Por isso já me conscientizei que se eu quero oferecer open-source não vou ter controle sobre o que acontece com ele, depois que eu publico.

      No seu caso, o produto será open-source e distribuído gratuitamente. Por mais que você crie uma chave pra validar o dominio, alguém pode ir no código e desabilitar isso e repassar sem a validação.

      De qualquer forma é possível fazer uma validação simples: cria um helper que refaz a mesma string de acordo com o domínio e verifica se é a mesma do campo da configuração do modulo. Usa o metodo de validação desse helper, e faz a verificação nos construtores dos seus modelos lançando uma exception caso as string sejam diferentes.

      Isso tirei aqui de cabeça, mas talvez de pra fazer algo mais sofisticado.

      Se você realmente quiser proteger o modulo e obrigar a criar a chave, você teria que obfuscar o código.

      Abraço,

  5. Sem html ja estou confusa… Pq todos sites estão fazendo isso?
    Valeu a dica

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.