Resetting Password com Laravel

Laravel
Tempo de leitura: 4 minutos

Resetting Password com Laravel: Perder a senha é uma situação comum para usuários de aplicações web. O Laravel oferece um sistema robusto e integrado para facilitar o processo de recuperação de senhas, permitindo que os usuários redefinam suas credenciais de forma segura.

Este artigo abordará detalhadamente como implementar o recurso de “Esqueci minha senha” em aplicações Laravel, desde a preparação do modelo até a exclusão de tokens expirados.

Preparação do Model

O primeiro passo é garantir que seu modelo User utilize o trait Notifiable, que permite o envio de notificações, incluindo os e-mails de redefinição de senha. Por padrão, o modelo User já inclui esse trait. Verifique se o seu modelo se parece com o exemplo abaixo:

PHP

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use HasFactory, Notifiable;

    // ... outras propriedades e métodos
}

Preparação do Banco de Dados

O Laravel utiliza uma tabela chamada password_resets para armazenar os tokens de redefinição de senha. Se você ainda não possui essa tabela, pode criá-la executando a seguinte migração:

Bash

php artisan make:migration create_password_resets_table

Em seguida, adicione o seguinte conteúdo ao arquivo de migração gerado:

PHP

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('password_resets', function (Blueprint $table) {
            $table->string('email')->index();
            $table->string('token');
            $table->timestamp('created_at')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('password_resets');
    }
};

Execute a migração:

Bash

php artisan migrate

Rotas

O Laravel já inclui as rotas necessárias para o reset de senha. Ao executar o comando php artisan ui:auth (ou php artisan make:auth em versões mais antigas), as rotas são definidas automaticamente no arquivo routes/web.php. Se você não utilizou esse comando, pode adicioná-las manualmente:

PHP

use App\Http\Controllers\Auth\ForgotPasswordController;
use App\Http\Controllers\Auth\ResetPasswordController;
use Illuminate\Support\Facades\Route;

Route::get('password/reset', [ForgotPasswordController::class, 'showLinkRequestForm'])->name('password.request');
Route::post('password/email', [ForgotPasswordController::class, 'sendResetLinkEmail'])->name('password.email');
Route::get('password/reset/{token}', [ResetPasswordController::class, 'showResetForm'])->name('password.reset');
Route::post('password/reset', [ResetPasswordController::class, 'reset'])->name('password.update');

Usando Hostinger como Host

Se você estiver utilizando a Hostinger como seu provedor de hospedagem, certifique-se de que o envio de e-mails esteja configurado corretamente. A Hostinger geralmente oferece suporte a SMTP. Configure as variáveis de ambiente em seu arquivo .env:

MAIL_MAILER=smtp
MAIL_HOST=smtp.hostinger.com
MAIL_PORT=587
[email protected]
MAIL_PASSWORD=sua_senha_de_email
MAIL_ENCRYPTION=tls
[email protected]
MAIL_FROM_NAME="${APP_NAME}"

Substitua os valores pelos seus dados de e-mail da Hostinger.

Exemplo Completo de Código

1. Formulário de Solicitação de Reset (resources/views/auth/passwords/email.blade.php):

HTML

<form method="POST" action="{{ route('password.email') }}">
    @csrf

    <label for="email">E-mail</label>
    <input id="email" type="email" name="email" value="{{ old('email') }}" required autofocus>

    <button type="submit">Enviar link de redefinição de senha</button>
</form>

2. Formulário de Reset de Senha (resources/views/auth/passwords/reset.blade.php):

HTML

<form method="POST" action="{{ route('password.update') }}">
    @csrf

    <input type="hidden" name="token" value="{{ $token }}">

    <label for="email">E-mail</label>
    <input id="email" type="email" name="email" value="{{ $email ?? old('email') }}" required autofocus>

    <label for="password">Nova Senha</label>
    <input id="password" type="password" name="password" required autocomplete="new-password">

    <label for="password-confirm">Confirmar Nova Senha</label>
    <input id="password-confirm" type="password" name="password_confirmation" required autocomplete="new-password">

    <button type="submit">Redefinir Senha</button>
</form>

3. Controladores (Já incluídos no Laravel com ui:auth):

  • ForgotPasswordController: Lida com o envio do link de reset.
  • ResetPasswordController: Lida com a redefinição da senha.

Deletando Tokens Expirados

O Laravel não exclui automaticamente os tokens expirados da tabela password_resets. É recomendável criar um comando Artisan para limpar esses tokens periodicamente.

1. Criar o comando:

Bash

php artisan make:command ClearExpiredPasswordResets

2. Implementar a lógica no comando (app/Console/Commands/ClearExpiredPasswordResets.php):

PHP

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;

class ClearExpiredPasswordResets extends Command
{
    protected $signature = 'password:clear-expired';
    protected $description = 'Deletes expired password reset tokens.';

    public function handle()
    {
        DB::table('password_resets')
            ->where('created_at', '<', Carbon::now()->subHours(2)) // Tokens com mais de 2 horas
            ->delete();

        $this->info('Expired password reset tokens cleared.');
    }
}

3. Agendar o comando (app/Console/Kernel.php):

PHP

protected function schedule(Schedule $schedule)
{
    $schedule->command('password:clear-expired')->daily(); // Executa diariamente
}

Este comando excluirá os tokens com mais de 2 horas (ou o tempo que você definir).

Conclusão

Resetting Password com Laravel: Com este guia, você aprendeu a implementar o sistema de reset de senha no Laravel, desde a configuração do modelo e banco de dados até a limpeza de tokens expirados. Seguindo estas práticas, você garante um processo de recuperação de senha seguro e eficiente para seus usuários. Lembre-se de testar todo o fluxo para garantir que está funcionando corretamente.

Mas antes de dominar o Laravel, se for o seu caso, toda jornada tem um início. Vamos entender quais são os conhecimentos básicos necessários para aproveitar ao máximo este poderoso framework. Para iniciar seus estudos no Laravel, você precisará dominar as seguintes tecnologias:

HTML
HTML
CSS
CSS
Javascript
JavaScript

E se você gosta do nosso conteúdo, não deixe de contribuir adquirindo os serviços e produtos dos nossos apoiadores e empresas que somos associados:

Hospedagem Hostinger
Ofertas Amazon
Amazon Prime
Author: Thiago Rossi