Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Recuperação de senha do usuário

Se eu sou um usuário do portal receitas e esqueci minha senha de acesso, como posso implementar o "Esqueci minha senha" para que ele envie um email, para o usuário e ele consiga trocar de senha?

Há alguma biblioteca do Django?

4 respostas

Oiii Raul, como você está?

Essa vai ser uma resposta longa hahahaha Mas vou fazer passo a passo com você explicando o porquê de cada procedimento e deixando algumas referências da documentação, tá bom? E se ficar alguma dúvida no meio do caminho, fique a vontade para perguntar =) Vamos lá:

A primeira informação é que sim, temos uma biblioteca do django responsável pelo procedimento de alterar a senha do usuário e enviar o e-mail.

A segunda informação é que o django nos fornece variáveis pré-definidas para que possamos configurar qual será o e-mail remetente e quais suas características, tais como; porta, servidor, protocolos, dentre outros. E essas informações são colocadas no arquivo settings.py do nosso projeto. No caso do curso, o nome do projeto é alura_receitas.

  • Então, o primeiro passo é ir até o arquivo settings.py da pasta alura_receitas e incluir o seguinte código ao final do arquivo:
# Configurações de envio do e-mail

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = "seu email vai aqui"
EMAIL_HOST_PASSWORD = "a senha do seu e-mail vai aqui"

Mas o que essas variáveis significam?

  • A variável EMAIL_BACKEND é para definirmos o tipo de e-mail que iremos enviar e temos suporte a vários tipos, como por exemplo: smtp (envia um e-mail real), console (grava os emails que seriam enviados para uma saída/terminal), arquivo ( grava e-mails em um arquivo), dentre outros. A lista completa de possibilidades pode ser consultada neste link. No nosso caso, iremos utilizar o smtp para enviar um e-mail real.

  • EMAIL_HOST se refere ao servidor que irá ser utilizado para enviar os e-mails. Nesse caso, estamos utilizando o servidor do próprio g-mail. Inclusive, para saber essas informações a respeito do g-mail, basta pesquisar: smtp gmail configuration e irá ser apresentado as informações de host, porta, dentre outros.

    • Poderia ser utilizado outro provedor de e-mail? Sim, sem problema algum, mas por uma questão do g-mail ser amplamente utilizado optei por ele.
  • EMAIL_PORT se refere a porta que seu provedor de e-mail trabalha, e nesse caso, o g-mail atua na porta 587

  • A variável EMAIL_USE_TLS recebe um valor booleano para especificar se iremos utilizar o protocolo TLS. O TLS nada mais é que do que um protocolo que irá criptografar os dados e autenticá-lo, deixando dessa forma uma conexão segura durante o envio do e-mai.

  • EMAIL_HOST_USER e EMAIL_HOST_PASSWORD se refere ao e-mail que irá enviar o link para recuperação, é necessário colocar o endereço e a senha do mesmo.

    • Após as configurações básicas, é necessário autorizar aplicativos "menos seguros" no g-mail para que o django consiga acessá-lo, isso porque o g-mail irá bloquear qualquer tentativa de acesso que não seja do próprio servidor deles. E para isso, vá até Acesso a app menos seguro da sua Conta do Google e ative a opção para permitir aplicativos menos seguros.

    • Caso sua conta do Google esteja configurada para verificação em duas etapas, você terá que criar uma nova senha de acesso para o projeto do django. E para isso:

      • Acesse sua Conta do Google
      • Selecione Segurança.
      • E em Como fazer login no Google selecione Senhas de app
      • Gere uma nova senha selecionando o app Outro (personalizado) e o nomeie como e-mail django.
      • Irá aparecer uma senha de 16 dígitos em um quadro amarelo, copie a mesma e cole na variável EMAIL_HOST_PASSWORD. Mas lembrando, esse procedimento é somente se sua conta g-mail estiver configurada para verificação em duas etapas. Caso não esteja, apenas autorizar aplicativos menos seguro já irá permitir o envio.

De posse das configurações feitas, agora irá iremos cadastrar nossas urls para fazermos a alteração de senha.

Como dito anteriormente, o django possui uma estrutura já pronta para que possamos trabalhar com recuperação de senha e ela está localizada no módulo auth.

No arquivo url.py do app de usuários iremos importá-la da seguinte forma:

from django.contrib.auth import views as auth_views

Na linha acima, usamos a cláusula as para apelidar a importação, isso ocorre para que não haja conflito com outras views existentes.

Quanto as urls, iremos utilizar quatro métodos que a biblioteca de autenticação das views nos oferece. São eles:

  • PasswordResetView: responsável por apresentar um formulário para que possamos preencher o e-mail de recuperação. Também gerará um link de uso único para a redefinição de senha e enviará esse link para o endereço de e-mail que for preenchido, caso o mesmo exista na base de dados.

  • PasswordResetDoneView: será a página mostrada depois que o usuário recebeu o link por e-mail para redifinir a senha. Entenda esse método como um template que irá mostrar que o e-mail foi enviado com sucesso.

  • PasswordResetConfirmView: esse método irá apresentar um formulário para inserir uma nova senha. E esse método possui algumas caracteristicas especiais, como o argumento uidb64 e o token. O token será para identificar se é uma senha válida conforme os padrões de segurança, já o uidb64 é o id do usuário codificado na base 64.

  • PasswordResetCompleteView: responsável por exibir ao usuário um template informando que a senha foi alterada com sucesso.

Agora que já sabemos para que serve cada método que iremos utilizar, vamos adicioná-los ao arquivo urls.py do app de usuários. Veja como fica em código:

path('reset_password/', auth_views.PasswordResetView.as_view(), name="reset_password"),
path('reset_password_sent/', auth_views.PasswordResetDoneView.as_view(), name="password_reset_done"),
path('reset/<uidb64>/<token>', auth_views.PasswordResetConfirmView.as_view(), name="password_reset_confirm"),
path('reset_password_complete/', auth_views.PasswordResetCompleteView.as_view(), name="password_reset_complete"),

Utilizamos o método as_view() porque como a visualização é baseada em uma classe, precisamos invocar essa função para que ela nos retorne uma visualização capaz de conectar a request ao nosso url. Também vale ressaltar que utilizei os nomes das urls em inglês por convenção da documentação, mas, poderia colocar o nome em português sem problema algum.

  • Com as nosas rotas configuradas, já podemos efetuar o teste. Basta acessarmos a rota: localhost:8000/usuarios/reset_password e será apresentado o formulário de redefinição:

Imgur

  • Agora, vamos preencher o e-mail que consta na base de dados e clicarmos para reinicializar a senha. No meu caso por exemplo:

Imgur

  • Após isso, será apresentada a tela de confirmação do envio do e-mail:

Imgur

  • E ao acessarmos o e-mail, terá um link de redefinição de senha:

Imgur

  • Ao clicarmos no link, seremos redirecionados para a página de redefinição de senha:

Imgur

  • Após preencher os campos, uma página de sucesso de alteração será mostrada:

Imgur

Prontinho, temos o nosso projeto configurado para enviar e-mail de redefinição de senha.

Agora que já temos tudo funcionando.... Concorda comigo que é estranho termos nossa página toda personalizada e quando vamos efetuar a troca de senha ser mostrado uma página totalmente diferente do nosso layout?

Pois bem, podemos personalizar a nossa própria página e passarmos para a rota. E para fazer isso, basta criarmos os arquivos html para cada função apresentada e linkarmos na classe utilizando o atributo template_name. Por exemplo:

path('reset_password/', auth_views.PasswordResetView.as_view(template_name="usuarios/password_reset.html"), name="reset_password")

No vídeo abaixo, eu fiz um template html personalizado para cada rota referente a troca de senha. Veja no vídeo abaixo o resultado:

Uffa!!! Por hoje é só, Raul. Sei que são muitas informações, mas faça com calma e qualquer coisa que não tenha entendido ou gerado algum erro, estou por aqui.

Grande abraço!

solução!

Perfeito! Você é fera. Vou copiar isso e deixar guardado rsrs.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software