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:
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: