احراز هویت دو مرحلهای (2FA) در Laravel — TOTP و امنیت حساب
رمز لو رفته؟ با 2FA مهاجم بدون کد ۶ رقمی TOTP وارد نمیشود. برای پنل ادمین، فینتک و هر حساب حساس، 2FA دیگر luxury نیست. Laravel چند مسیر دارد: Jetstream built-in، Fortify features، یا پکیج سفارشی.
2FA چگونه کار میکند؟
- کاربر QR را با Google Authenticator / Authy اسکن میکند
- secret در DB encrypted ذخیره میشود
- هر login: password + کد ۶ رقمی time-based (TOTP)
- recovery codes یکبارمصرف برای گم شدن گوشی
مسیر ۱ — Laravel Jetstream
Jetstream با Fortify 2FA کامل دارد — اگر از اول stack بزرگ میخواهید:
composer require laravel/jetstream
php artisan jetstream:install livewire
# یا inertia
برای پروژه minimal شاید سنگین — Breeze + fortify دستی.
مسیر ۲ — Fortify features
Fortify backend auth را handle میکند — twoFactorAuthentication در config fortify فعال شود. UI خودتان در Blade/Livewire.
فیلدهای معمول users
$table->text('two_factor_secret')->nullable();
$table->text('two_factor_recovery_codes')->nullable();
$table->timestamp('two_factor_confirmed_at')->nullable();
secret هرگز plain نمایش داده نشود بعد از setup.
جریان login با 2FA
- validate email/password
- اگر 2FA فعال → redirect به challenge view
- validate TOTP با window زمانی (±1 period)
- session regenerate
Recovery codes
۱۰ کد یکبارمصرف — hash ذخیره کنید. بعد از استفاده invalidate شود.
اجبار 2FA برای admin
// middleware
if ($user->is_admin && ! $user->two_factor_confirmed_at) {
return redirect()->route('profile.2fa');
}
ترکیب با Policy.
امنیت
- encrypt two_factor_secret
- rate limit روی challenge
- notify email وقتی 2FA فعال شد
- HTTPS اجباری
SMS 2FA؟
کمتر امن از TOTP (SIM swap) — فقط اگر TOTP ممکن نیست.
جمعبندی
admin و sensitive data → 2FA. موبایل API: Sanctum + device binding جدا. Session: session guide.