Configuration SMTP et 2FA par code PIN e-mail

Paramètres du site :
- Nouvelle section "Serveur SMTP" avec host, port, chiffrement,
  identifiant, mot de passe, adresse/nom d'expéditeur
- Bouton "Envoyer un e-mail de test" (AJAX via Symfony EsmtpTransport) :
  tente la connexion + envoie un message réel à l'admin
- Badge "Configuré — 2FA actif" quand SMTP est en place
- Suppression de la configuration possible

Authentification 2FA :
- Si SMTP configuré : après validation identifiant/mot de passe,
  l'utilisateur est déconnecté, un PIN à 6 chiffres est généré,
  haché (bcrypt) et stocké en session, envoyé par e-mail (10 min)
- Page /2fa : saisie du PIN, bouton "Renvoyer le code", retour login
- Si l'envoi e-mail échoue : fallback sans 2FA (logue l'erreur)
- Si SMTP non configuré : login standard inchangé

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-04 18:59:18 +02:00
parent e6f4d0c565
commit 07ab2a7063
11 changed files with 564 additions and 19 deletions
+8
View File
@@ -7,6 +7,7 @@ use App\Http\Controllers\NotificationController;
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\RechercheController;
use App\Http\Controllers\ReleveController;
use App\Http\Controllers\Auth\TwoFactorController;
use App\Http\Controllers\SetupController;
use App\Http\Controllers\SourceController;
use Illuminate\Support\Facades\Route;
@@ -23,6 +24,13 @@ Route::prefix('setup')->name('setup.')->group(function () {
Route::post('/install', [SetupController::class, 'install'])->name('install');
});
// ── Authentification 2FA par code PIN ───────────────────────────────────────
Route::middleware('guest')->group(function () {
Route::get('2fa', [TwoFactorController::class, 'challenge'])->name('2fa.challenge');
Route::post('2fa', [TwoFactorController::class, 'verify'])->name('2fa.verify');
Route::post('2fa/resend', [TwoFactorController::class, 'resend'])->name('2fa.resend');
});
Route::get('/', function () {
return view('welcome');
});