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

# Verifica email (Email Verification)

> Spiega la procedura per implementare la funzionalità di verifica email di Laravel. Imparerai preparazione del modello, definizione delle 3 route, middleware verified, personalizzazione ed eventi.

## Introduzione

La verifica email (Email Verification) è il meccanismo che verifica se un utente possiede realmente l'indirizzo email registrato. Laravel fornisce di default l'invio dell'email di conferma e il processo di verifica, così puoi costruire un flusso di autenticazione sicuro con un'implementazione minima.

<Info>
  Se usi gli starter kit, le schermate di autenticazione e il flusso di verifica email sono già integrati. Se implementi tutto a mano, definisci autonomamente modello, route e viste seguendo le istruzioni di questa pagina.
</Info>

## Preparazione di modello e database

### Implementare MustVerifyEmail

Assicurati che `App\Models\User` implementi `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;
}
```

Aggiungendo questa interfaccia, l'email di conferma viene inviata automaticamente ai nuovi utenti registrati. Se implementi la registrazione senza usare gli starter kit, emetti l'evento `Registered` dopo che la registrazione ha avuto successo.

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

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

### Verifica della colonna email\_verified\_at

La tabella `users` deve avere la colonna `email_verified_at`. Di norma è già inclusa nella migration di default `0001_01_01_000000_create_users_table.php`.

## Routing (3 route)

Per la verifica email definisci le 3 route `verification.notice`, `verification.verify` e `verification.send`.

<Steps>
  <Step title="Definisci la route di notifica di verifica (verification.notice)">
    Restituisce la schermata che mostra "controlla la tua email" agli utenti non verificati.

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

  <Step title="Definisci la route di gestione della verifica (verification.verify)">
    Quando l'utente clicca sul link nell'email, verifica l'URL firmato e completa la verifica.

    ```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="Definisci la route di reinvio (verification.send)">
    Reinvia l'email di conferma se l'utente l'ha smarrita.

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

## Protezione delle route

Per consentire l'accesso solo agli utenti verificati usa il middleware `verified`. Di solito lo combini con `auth`.

```php theme={null}
Route::get('/profile', function () {
    // Accessibile solo agli utenti verificati
})->middleware(['auth', 'verified']);
```

Quando un utente non verificato accede, Laravel lo reindirizza automaticamente a `verification.notice`.

## Personalizzazione

Per personalizzare il corpo dell'email di conferma, configura `VerifyEmail::toMailUsing` nel metodo `boot` di `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);
    });
}
```

## Eventi

Alla verifica email viene emesso l'evento `Illuminate\Auth\Events\Verified`. Con gli starter kit è gestito automaticamente; nell'implementazione manuale, aggiungi la gestione dell'evento se necessario.


## Related topics

- [Laravel Fortify e gli starter kit](/it/advanced/fortify.md)
- [Protezione CSRF](/it/csrf.md)
- [Invio di email](/it/mail.md)
- [Guida alla migrazione da laravel/ui a Fortify](/it/blog/ui-to-fortify.md)
- [Autenticazione Service Account - Google Sheets API for Laravel](/it/packages/laravel-google-sheets/service-account.md)
