3
respostas

Link temporária para recuperar senha

Olá, Como vai? Gostaria de saber como criar um link temporário para recuperação de senha no codeInigter, o qual seria enviado para o email de quem esqueceu a senha e deseja criar uma nova. Muito Obrigado!!!

3 respostas

Olá, Charly.

Crie uma tabela, por exemplo:

CREATE TABLES password_reset (
    id int not null auto_increment primary key,
    token varchar(255) not null,
    created_at datetime not null
);

Após crie a classe responsável por gerenciar esse token, por exemplo:

class token
{
    /**
      * $string pode ser passado e-mail + y-m-d H:i:s + rand(1, 999999999). Apensa um exemplo para hash único
      */
    public function create($string) : string
    {
        return password_hash($string, PASSWORD_DEFAULT);
    }

    /**
      * $entityManager (Exemplo tomando como base o Doctrine)
      * $toke A string recebida na request (da url do e-mail)
      */
    public function validate($entityManager, $token) : bool
    {
        $data = $entityManager->findByToken($token);

        $dateStart = new \DateTime($data->getCreatedAt() );
        $dateNow   = new \DateTime(date('Y-m-d'));

        $dateDiff = $dateStart->diff($dateNow);

        return $dateDiff->days >= 1;
    }
}

Com isso você pode controlar se o intervalo deve ser maior que 1 dia ou o que você desejar, pois pode ser um parâmetro configurado no banco de dados e retornado para a validação.

Espero ter lhe auxiliado.

Att,

Obrigado Diego Brocanelli pela ajuda, foi útil. Mas a dúvida principal é como gerar um link, o qual será enviado para o e-mail do usuário, quel quando clicado abrirá uma página para troca de senha.

Olá, Charly.

Para montar o link você utilizará a tag a, com ela podemos montar dinamicamente o link, veja exemplo abaixo:

// coletamos o schema, Ex: http ou https
$schema = filter_input(INPUT_SERVER, 'REQUEST_SCHEME') ; 
// coletamos o host, EX: www.meu-site.com
$host = filter_input(INPUT_SERVER, 'HTTP_HOST') ;
// O token de validação
$token = 'a1cbas23asda4rt5w6ut';
// montamos o link, Ex: http://www.meu-site.com/reset/password/token/a1cbas23asda4rt5w6ut
$link = "{$schema}://{$host}/reset/password/token/{$token}";

Após montagem do link basta inserir o mesmo no template html no qual você utiliza para disparo do e-mail.

<a href="<?= $link; ?> ">

Observação: O melhor será você utilizar um template engine, para que não insira PHP em seu HTML :)

Espero ter dado alguma luz para sua dúvida.

Att,

Diego Brocanelli