> Manuales > Manual de Laravel

Cómo usar el sistema de verificación de email que nos ofrece Laravel. En este artículo aprenderás a activarlo y a comprobar que los usuarios han verficado los correos usando un middleware para las rutas o programáticamente en los controladores.

Activar y usar el sistema de verificación de email en Laravel

Una de las cosas típicas que se deben hacer en las aplicaciones web es la verificación del email de los usuarios registrados. Lo habrás visto en decenas de aplicaciones así que sabes qué es y la importancia que tiene para mantener limpia nuestra base de datos de direcciones de correo electrónico.

En este artículo vamos a ver los pasos que necesitas para montar el sistema de verificación de email que viene incorporado con Laravel.

Scaffolding del sistema de autenticación

Si estás usando Laravel generalmente te basas en algún andamiaje para construir la base de tu aplicación y el sistema de autenticación. Tienes diversos starter kits para construir esas partes y el más sencillo es Laravel Breeze. Otro más complejo es Laravel Jetstream.

Si no tienes ese sistema de autenticación ya creado te recomendamos que leas el artículo dedicado a Laravel Breeze, ya que te quitará mucho trabajo y te ofrecerá todos los controladores y vistas necesarias para realizar los pasos siguientes y montar el sistema de verificación del email en pocos minutos.

Adaptar el modelo de User

Lo primero que debes hacer es activar el sistema de verificación en el modelo de User. Abre el archivo User.php de tu proyecto, que actualmente se encuentra en la carpeta de Models.

En ese archivo tienes que implementar la interfaz MustVerifyEmail:

use Illuminate\Contracts\Auth\MustVerifyEmail;

class User extends Authenticatable implements MustVerifyEmail
{
   ...
}

Con este cambio al registrarse tus usuarios recibirán el típico email de verificación del correo electrónico.

En la clase App\Providers\EventServiceProvider puedes encontrar el listener configurado para que se envíen esos emails. Se trata de una clase llamada SendEmailVerificationNotification. Este manejador está escuchando el evento de la clase Illuminate\Auth\Events\Registered. Por lo tanto, si estas creando tu propio servicio de autenticación y quieres que se envíe ese email debes asegurarte de hacer el dispatch del evento Illuminate\Auth\Events\Registered.

Rutas de la aplicación

Si estás usando un starter kit como Laravel Breeze no necesitarás crear ninguna ruta en particular, dado que ya te las ofrecen listas. Están todas en el archivo routes/auth.php.

En caso que no uses un starter kit tendrás que hacer algunos pasos extra, creando las rutas por tu cuenta. Es una situación no demasiado normal, por lo que te indicamos que consultes en la documentación del sistema de verificación de email en la página de Laravel.

Controladores

Igualmente, no es necesario modificar los controladores, ya que Laravel te los da listos.

Vistas

Las vistas del sistema de verificación también han sido generadas por Breeze o cualquier otro starter kit que uses. De todos modos, siempre puedes personalizar la vista resources/views/auth/verify-email.blade.php para adaptar los mensajes que veas necesarios.

Configuración de correo

En Laravel puedes tener el correo configurado de diversas maneras para que se puedan interceptar los mensajes en la etapa de desarrollo.

Lo más fácil de todo es que los emails se envíen al log, para lo que tendrás que activar el "log" como driver de email. Esto lo haces en el archivo .env.

MAIL_MAILER=log

En versiones antiguas de Laravel esta configuración venía como MAIL_DRIVER. Actualmente se usa MAIL_MAILER.

De todos modos, si has creado un .env para producción o tienes creado tu nuevo proyecto de Laravel con Sail puedes tener otras configuraciones en el .env que también son perfectamente válidas.

Por ejemplo ahora se usa el proyecto Mailpit para interceptar el correo durante la etapa de desarrollo y el .env tendría este código.

MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="miguel@mi-app-desarrollada.com"
MAIL_FROM_NAME="${APP_NAME}"

Cómo usar el middleware para asegurar que el email está verificado

En muchas aplicaciones necesitamos verificar que el usuario está verificado para realizar algunas acciones. Para conseguirlo fácilmente Laravel nos ofrece un middleware que nosotros podemos activar en las rutas que necesitemos.

Generalmente usaremos dos middlewares, auth para comprobar que está autenticado y verified para comprobar que está verificado su correo. El código de una ruta de aplicación se vería más o menos así:

route::middleware(['auth', 'verified'])->get('/nuevo-producto', [ProductCreationController::class, 'create']);

Con el uso de estos middlewares, cuando un usuario no está registrado se enviará a la ruta de login. En el caso que no esté verificado su email se enviará a la ruta con el nombre verification.notice, tal como puedes ver en el código del middleware que tienes en \Illuminate\Auth\Middleware\EnsureEmailIsVerified.

Si necesitas personalizar este comportamiento puedes publicar los middlewares:

php artisan vendor:publish --tag=laravel-middlewares

Cómo comprobar programáticamente si un usuario está verificado

Si por cualquier motivo en tu código, por ejemplo en un controlador, necesitas comprobar si un usuario está verificado puedes hacerlo con el método hasVerifiedEmail() del modelo de User.

if($user->hasVerifiedEmail()) {
    // Está verificado
}

Si este método no lo tienes en tu modelo de user puedes probar simplemente a verificar si la casilla email_verified_at de la tabla de users está a null o no.

if (Auth::user()->email_verified_at !== null) {
    // El usuario ha verificado su correo electrónico
} else {
    // El usuario NO ha verificado su correo electrónico
}

Ahora bien, si estás haciendo un comportamiento más genérico no es suficiente comprobar si está verificado, sino además ver si se ha configurado la aplicación para que el comportamiento de verificación de emails ha sido activado. Esto lo conseguimos con un condicional un poco más largo.

Por ejemplo, en el siguiente condicional vamos a comprobar si un usuario NO está verificado, pero solamente si se ha activado el sistema de verificación de emails en la aplicación.

if ($user instanceof MustVerifyEmail && ! $user->hasVerifiedEmail()) {
      // El usuario no estaba verificado y se había activado el sistema de verificación de emails.
  }

Con estos pasos, deberías haber implementado y usado la verificación de correo electrónico en tu aplicación Laravel, ayudados con el código de base que nos ofrece Laravel Breeze.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual