#Introducción
Muchas aplicaciones web requieren que los usuarios verifiquen sus direcciones de correo electrónico antes de usar la aplicación. En lugar de obligarle a implementar esta función manualmente para cada aplicación que cree, Laravel ofrece servicios integrados convenientes para enviar y verificar solicitudes de verificación de correo electrónico.
¿Quiere empezar rápido? Instale uno de los starter kits de aplicaciones Laravel en una aplicación Laravel nueva. Los starter kits se encargan de generar todo el sistema de autenticación, incluyendo el soporte para la verificación de correo electrónico.
#Preparación del modelo
Antes de comenzar, verifique que su modelo App\Models\User implemente el contrato Illuminate\Contracts\Auth\MustVerifyEmail:
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable implements MustVerifyEmail
{
use Notifiable;
// ...
}
Una vez que esta interfaz se haya añadido a su modelo, a los usuarios recién registrados se les enviará automáticamente un correo electrónico con un enlace para verificar su dirección de correo. Como puede ver al examinar el App\Providers\EventServiceProvider de su aplicación, Laravel ya incluye un listener llamado SendEmailVerificationNotification que está vinculado al evento Illuminate\Auth\Events\Registered. Este listener enviará el enlace de verificación al usuario.
Si está implementando el registro manualmente en su aplicación en lugar de usar un starter kit, debe asegurarse de despachar el evento Illuminate\Auth\Events\Registered después de que el registro del usuario sea exitoso:
use Illuminate\Auth\Events\Registered;
event(new Registered($user));
#Preparación de la base de datos
A continuación, su tabla users debe contener una columna email_verified_at para almacenar la fecha y hora en que se verificó la dirección de correo electrónico del usuario. Por defecto, la migración de la tabla users incluida con el framework Laravel ya contiene esta columna. Por lo tanto, solo necesita ejecutar sus migraciones de base de datos:
php artisan migrate
#Rutas
Para implementar correctamente la verificación de correo electrónico, se deben definir tres rutas. Primero, se necesita una ruta para mostrar un aviso al usuario indicándole que debe hacer clic en el enlace de verificación enviado por correo electrónico después del registro.
En segundo lugar, se necesita una ruta para manejar las solicitudes generadas cuando el usuario hace clic en el enlace de verificación del correo.
En tercer lugar, se necesita una ruta para reenviar un enlace de verificación si el usuario pierde accidentalmente el primer enlace.
#El aviso de verificación de correo electrónico
Como se mencionó anteriormente, debe definirse una ruta que devuelva una vista que instruya al usuario a hacer clic en el enlace de verificación que Laravel le envió por correo después del registro. Esta vista se mostrará a los usuarios cuando intenten acceder a otras partes de la aplicación sin haber verificado primero su dirección de correo electrónico. Recuerde, el enlace se envía automáticamente al usuario siempre que su modelo App\Models\User implemente la interfaz MustVerifyEmail:
Route::get('/email/verify', function () {
return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');
La ruta que devuelve el aviso de verificación de correo debe llamarse verification.notice. Es importante que la ruta tenga este nombre exacto, ya que el middleware verified incluido con Laravel redirigirá automáticamente a esta ruta si un usuario no ha verificado su correo electrónico.
Cuando implemente manualmente la verificación de correo electrónico, debe definir usted mismo el contenido de la vista del aviso de verificación. Si desea un scaffolding que incluya todas las vistas necesarias para autenticación y verificación, consulte los starter kits de aplicaciones Laravel.
#El manejador de verificación de correo electrónico
A continuación, debemos definir una ruta que maneje las solicitudes generadas cuando el usuario hace clic en el enlace de verificación enviado por correo. Esta ruta debe llamarse verification.verify y asignarse los middlewares auth y signed:
use Illuminate\Foundation\Auth\EmailVerificationRequest;
Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
$request->fulfill();
return redirect('/home');
})->middleware(['auth', 'signed'])->name('verification.verify');
Antes de continuar, veamos más de cerca esta ruta. Primero, notará que estamos usando un tipo de solicitud EmailVerificationRequest en lugar de la instancia típica Illuminate\Http\Request. EmailVerificationRequest es un form request incluido con Laravel. Esta solicitud se encarga automáticamente de validar los parámetros id y hash de la petición.
Luego, podemos proceder directamente a llamar al método fulfill en la solicitud. Este método llamará al método markEmailAsVerified en el usuario autenticado y despachará el evento Illuminate\Auth\Events\Verified. El método markEmailAsVerified está disponible en el modelo App\Models\User por defecto a través de la clase base Illuminate\Foundation\Auth\User. Una vez que la dirección de correo electrónico del usuario ha sido verificada, puede redirigirlo a donde desee.
#Reenvío del correo de verificación
A veces un usuario puede extraviar o eliminar accidentalmente el correo de verificación. Para esto, puede definir una ruta que permita al usuario solicitar que se reenvíe el correo de verificación. Luego, puede hacer una solicitud a esta ruta colocando un botón de envío de formulario simple dentro de su vista del aviso de verificación:
use Illuminate\Http\Request;
Route::post('/email/verification-notification', function (Request $request) {
$request->user()->sendEmailVerificationNotification();
return back()->with('message', '¡Enlace de verificación enviado!');
})->middleware(['auth', 'throttle:6,1'])->name('verification.send');
#Protección de rutas
El middleware de rutas puede usarse para permitir que solo los usuarios verificados accedan a una ruta determinada. Laravel incluye un alias de middleware verified, que es un alias para la clase Illuminate\Auth\Middleware\EnsureEmailIsVerified. Dado que este middleware ya está registrado en el kernel HTTP de su aplicación, solo necesita adjuntarlo a la definición de una ruta. Normalmente, este middleware se usa junto con el middleware auth:
Route::get('/profile', function () {
// Solo los usuarios verificados pueden acceder a esta ruta...
})->middleware(['auth', 'verified']);
Si un usuario no verificado intenta acceder a una ruta que tiene asignado este middleware, será redirigido automáticamente a la ruta nombrada verification.notice named route.
#Personalización
#Personalización del correo de verificación
Aunque la notificación de verificación de correo predeterminada debería satisfacer los requisitos de la mayoría de las aplicaciones, Laravel le permite personalizar cómo se construye el mensaje del correo de verificación.
Para comenzar, pase un closure al método toMailUsing proporcionado por la notificación Illuminate\Auth\Notifications\VerifyEmail. El closure recibirá la instancia del modelo notifiable que recibe la notificación, así como la URL firmada de verificación de correo que el usuario debe visitar para verificar su dirección. El closure debe devolver una instancia de Illuminate\Notifications\Messages\MailMessage. Normalmente, debe llamar al método toMailUsing desde el método boot de la clase App\Providers\AuthServiceProvider de su aplicación:
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;
/**
* Registrar cualquier servicio de autenticación / autorización.
*/
public function boot(): void
{
// ...
VerifyEmail::toMailUsing(function (object $notifiable, string $url) {
return (new MailMessage)
->subject('Verify Email Address')
->line('Click the button below to verify your email address.')
->action('Verify Email Address', $url);
});
}
Para aprender más sobre notificaciones por correo, consulte la documentación de notificaciones por correo.
#Eventos
Cuando usa los starter kits de aplicaciones Laravel, Laravel despacha eventos durante el proceso de verificación de correo electrónico. Si está manejando la verificación de correo manualmente en su aplicación, puede que desee despachar estos eventos manualmente después de que la verificación se complete. Puede adjuntar listeners a estos eventos en el EventServiceProvider de su aplicación:
use App\Listeners\LogVerifiedUser;
use Illuminate\Auth\Events\Verified;
/**
* Mapeo de listeners de eventos para la aplicación.
*
* @var array
*/
protected $listen = [
Verified::class => [
LogVerifiedUser::class,
],
];