dragonzap/2fa
Laravel 2FA package with email-based codes by default and optional TOTP for Google/Microsoft Authenticator. Protect routes via the twofactor middleware (always or if-enabled). Publish config, run migrations, and override classes to fully customize the flow.
Installation
composer require dragonzap/2fa
Publish the config file:
php artisan vendor:publish --provider="DragonZap\TwoFactorAuth\TwoFactorAuthServiceProvider"
Configuration
Edit config/2fa.php to define:
totp or backup_codes).YourAppName).First Use Case: Enable 2FA for a User
use DragonZap\TwoFactorAuth\Facades\TwoFactorAuth;
// Generate and display QR code for TOTP setup
$qrCodeUrl = TwoFactorAuth::generateQrCode($user->email, 'YourAppName');
return view('setup.2fa', compact('qrCodeUrl'));
// Verify TOTP code
if (TwoFactorAuth::verifyCode($user, $request->input('code'))) {
$user->is_2fa_enabled = true;
$user->save();
}
TOTP Setup
// Generate secret and QR code
$secret = TwoFactorAuth::generateSecret();
$qrCodeUrl = TwoFactorAuth::generateQrCode($user->email, config('2fa.totp.issuer'));
// Store secret in DB (e.g., `user.totp_secret`)
$user->totp_secret = $secret;
$user->save();
Backup Codes
// Generate and store backup codes
$backupCodes = TwoFactorAuth::generateBackupCodes();
$user->backup_codes = json_encode($backupCodes);
$user->save();
TOTP Verification
if (TwoFactorAuth::verifyCode($user, $request->input('code'))) {
// Grant access
} else {
// Show error
}
Backup Code Verification
if (TwoFactorAuth::verifyBackupCode($user, $request->input('backup_code'))) {
// Grant access and invalidate the code
TwoFactorAuth::invalidateBackupCode($user, $request->input('backup_code'));
}
Protect routes with the TwoFactorAuth middleware:
Route::middleware(['auth', '2fa'])->group(function () {
// Routes requiring 2FA
});
The middleware checks is_2fa_enabled and verifies the current request’s code.
$user->is_2fa_enabled = false;
$user->totp_secret = null;
$user->backup_codes = null;
$user->save();
Extend your users table with:
Schema::table('users', function (Blueprint $table) {
$table->boolean('is_2fa_enabled')->default(false);
$table->text('totp_secret')->nullable();
$table->text('backup_codes')->nullable(); // JSON-encoded array
});
generateQrCode() method to render QR codes in Blade:
{!! TwoFactorAuth::generateQrCodeImage($qrCodeUrl) !!}
Log 2FA events (e.g., setup, verification failures) for security auditing:
if (!TwoFactorAuth::verifyCode($user, $code)) {
event(new TwoFactorAuthFailed($user->id, $code));
}
Secret Storage
encrypt() when saving/retrieving secrets if additional security is needed.Backup Code Reuse
TwoFactorAuth::invalidateBackupCode($user, $code);
Time Synchronization
Rate Limiting
throttle middleware or implement custom logic:
Route::middleware(['throttle:5,1'])->group(...);
Provider Switching
TwoFactorAuth facade or create a custom provider system.Verification Failures
TwoFactorAuth::checkCode($user, $code) to manually test codes (returns true/false).date('U')).QR Code Issues
issuer and secret in the QR code URL match your config:
otpauth://totp/YourAppName:user@example.com?secret=JBSWY3DPEHPK3PXP&issuer=YourAppName
Backup Code Validation
$codes = json_decode($user->backup_codes, true);
var_dump(TwoFactorAuth::verifyBackupCode($user, 'TEST123')); // Should return bool
Custom Providers
DragonZap\TwoFactorAuth\Contracts\TwoFactorProvider interface to support:
Event Hooks
TwoFactorAuthGenerated, TwoFactorAuthVerified, or BackupCodeInvalidated:
TwoFactorAuth::addListener('TwoFactorAuthVerified', function ($user) {
// Send notification or log event
});
Configuration Overrides
TwoFactorAuth::setTOTPOptions($user, [
'step' => 30, // Custom time step (default: 30s)
'digits' => 6,
]);
Fallback Mechanisms
if (TwoFactorAuth::isRecoveryModeEnabled($user)) {
// Allow password fallback or admin intervention
}
How can I help you explore Laravel packages today?