Come implementare l'autenticazione a due fattori (2FA) in Laravel

L'autenticazione a due fattori (2FA) è una misura di sicurezza che aggiunge un ulteriore livello di protezione agli account utente. In Laravel, puoi implementare il 2FA utilizzando un pacchetto come pragmarx/google2fa oppure manualmente con Google Authenticator. In questo articolo vedremo come configurare un'autenticazione 2FA di base con il pacchetto google2fa-laravel.

1. Installazione del pacchetto

Per prima cosa, installa il pacchetto pragmarx/google2fa-laravel tramite Composer:

composer require pragmarx/google2fa-laravel

Pubblica la configurazione del pacchetto:

php artisan vendor:publish --provider="PragmaRX\Google2FALaravel\ServiceProvider"

2. Modifica della tabella utenti

Aggiungi una colonna alla tabella degli utenti per salvare la chiave segreta:

Schema::table('users', function (Blueprint $table) {
    $table->text('google2fa_secret')->nullable();
});

Esegui la migrazione:

php artisan migrate

3. Generazione del secret 2FA

Nel controller del profilo o della sicurezza, puoi generare e salvare la chiave segreta:

use PragmaRX\Google2FALaravel\Support\Authenticator;

public function enable2FA(Request $request)
{
    $user = auth()->user();
    $google2fa = app('pragmarx.google2fa');

    $secret = $google2fa->generateSecretKey();
    $user->google2fa_secret = $secret;
    $user->save();

    $QR_Image = $google2fa->getQRCodeInline(
        config('app.name'),
        $user->email,
        $secret
    );

    return view('2fa.qr', [
        'QR_Image' => $QR_Image,
        'secret' => $secret
    ]);
}

4. Verifica del codice OTP

Crea una rotta e un controller per verificare il codice inserito dall’utente:

use Illuminate\Http\Request;

public function verify2FA(Request $request)
{
    $user = auth()->user();
    $google2fa = app('pragmarx.google2fa');

    $valid = $google2fa->verifyKey($user->google2fa_secret, $request->input('otp'));

    if ($valid) {
        $request->session()->put('2fa_passed', true);
        return redirect()->intended();
    } else {
        return back()->withErrors(['otp' => 'Codice non valido']);
    }
}

5. Middleware per proteggere le rotte

Crea un middleware per controllare se l'utente ha superato la verifica 2FA:

public function handle($request, Closure $next)
{
    if (!session('2fa_passed')) {
        return redirect()->route('2fa.prompt');
    }

    return $next($request);
}

Conclusione

Con questi passaggi hai configurato una semplice autenticazione a due fattori in Laravel. Puoi estendere la logica per includere opzioni di disattivazione, backup codes o integrazione con app diverse da Google Authenticator.

Assicurati sempre di criptare le chiavi segrete nel database e di proteggere adeguatamente le rotte critiche con middleware.

Torna su