> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Verificación de correo electrónico (Email Verification)

> Explicamos cómo implementar la verificación de correo electrónico en Laravel. Aprenderás sobre la preparación del modelo, la definición de las tres rutas, el middleware verified, personalización y eventos.

## Introducción

La verificación de correo electrónico (Email Verification) es un mecanismo para comprobar que el usuario realmente posee la dirección de correo que ha registrado. Laravel proporciona de serie el envío del correo de confirmación y la lógica de verificación, por lo que puedes construir un flujo de autenticación seguro con muy poca implementación.

<Info>
  Si utilizas un starter kit, las pantallas de autenticación y el flujo de verificación de correo ya están integrados. Si lo implementas manualmente, sigue los pasos de esta página para definir por tu cuenta el modelo, las rutas y las vistas.
</Info>

## Preparación del modelo y de la base de datos

### Implementar MustVerifyEmail

Comprueba que `App\Models\User` implemente la interfaz `Illuminate\Contracts\Auth\MustVerifyEmail`.

```php theme={null}
<?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;
}
```

Al añadir esta interfaz, se envía automáticamente un correo de confirmación a los nuevos usuarios registrados. Si estás implementando el registro sin usar un starter kit, tras el registro exitoso debes emitir el evento `Registered`.

```php theme={null}
use Illuminate\Auth\Events\Registered;

event(new Registered($user));
```

### Comprobar la columna email\_verified\_at

La tabla `users` debe contar con una columna `email_verified_at`. Habitualmente ya está incluida en la migración por defecto `0001_01_01_000000_create_users_table.php`.

## Enrutamiento (tres rutas)

Para la verificación de correo se definen tres rutas: `verification.notice`, `verification.verify` y `verification.send`.

<Steps>
  <Step title="Definir la ruta de aviso de verificación (verification.notice)">
    Devuelve la pantalla que muestra a los usuarios no verificados el mensaje "Por favor, verifica tu correo".

    ```php theme={null}
    Route::get('/email/verify', function () {
        return view('auth.verify-email');
    })->middleware('auth')->name('verification.notice');
    ```
  </Step>

  <Step title="Definir la ruta de verificación (verification.verify)">
    Cuando el usuario pulsa el enlace del correo, se valida la URL firmada y se completa la verificación.

    ```php theme={null}
    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');
    ```
  </Step>

  <Step title="Definir la ruta de reenvío (verification.send)">
    Reenvía el correo de verificación si el usuario lo pierde.

    ```php theme={null}
    use Illuminate\Http\Request;

    Route::post('/email/verification-notification', function (Request $request) {
        $request->user()->sendEmailVerificationNotification();

        return back()->with('message', 'Verification link sent!');
    })->middleware(['auth', 'throttle:6,1'])->name('verification.send');
    ```
  </Step>
</Steps>

## Protección de rutas

Para permitir el acceso solo a usuarios ya verificados, usa el middleware `verified`. Habitualmente se combina con `auth`.

```php theme={null}
Route::get('/profile', function () {
    // Solo accesible por usuarios verificados
})->middleware(['auth', 'verified']);
```

Si un usuario no verificado accede, Laravel lo redirige automáticamente a `verification.notice`.

## Personalización

Para personalizar el cuerpo del correo de verificación, configura `VerifyEmail::toMailUsing` en el método `boot` de `AppServiceProvider`.

```php theme={null}
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;

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);
    });
}
```

## Eventos

Cuando se completa la verificación de correo se dispara el evento `Illuminate\Auth\Events\Verified`. Los starter kits lo gestionan automáticamente; en una implementación manual, añade el manejo del evento según lo necesites.


## Related topics

- [Comparativa de métodos de autenticación - Laravel Bluesky](/es/packages/laravel-bluesky/authentication.md)
- [Laravel Fortify y los starter kits](/es/advanced/fortify.md)
- [Envío de correo](/es/mail.md)
- [Verificación (Verify)](/es/packages/laravel-bluesky/verify.md)
- [Socialite - Laravel Bluesky](/es/packages/laravel-bluesky/socialite.md)
