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.