ورود بدون رمز به لاراول با لینک جادویی ایمیل
خلاصهٔ کاملتر
مقالهای تو Laravel News یه پکیج تازه به اسم Email Magic Link رو معرفی میکنه که احراز هویت بدون رمز عبور رو برای لاراول میاره. به گفتهٔ نویسنده (Paul Redmond)، این پکیج کاربر رو با یه لینک ایمیلی یا کد یهبارمصرف وارد میکنه، هم مستقل کار میکنه هم کنار Laravel Fortify، و جز خود فریمورک هیچ وابستگی اضافهای موقع اجرا نمیخواد.
مشکل همیشگی لینکهای جادویی اینه که ابزارهای امنیتی و کلاینتهای ایمیل هر URL توی پیام رو از قبل باز میکنن؛ اگه همون باز کردن (یه درخواست GET) توکن یهبارمصرف رو مصرف کنه، اسکنر قبل از کاربر توکن رو میسوزونه. این پکیج جریان رو دو تیکه میکنه: درخواست GET روی مسیر verify فقط یه صفحهٔ تأیید امضاشده نشون میده و چیزی رو تغییر نمیده، و توکن فقط با یه POST صریح از همون صفحه مصرف میشه که اسکنر نمیفرستتش.
امنیت سر جای ذخیرهسازی هم رعایت شده. توکنها و کدها هیچوقت به صورت خام ذخیره نمیشن و فقط یه هش HMAC-SHA256 با کلید نگه داشته میشه. مصرف توکن با یه ادعای شرطیِ بدون شرایط رقابتی (race-free) انجام میشه، پاسخ درخواستها چه ایمیل وجود داشته باشه چه نه یکسانه، و هر توکن قفل جداگانهٔ خودش رو در برابر حملهٔ brute-force داره (پیشفرض max_attempts_per_token برابر ۵).
یه نکتهٔ مهم اینه که اگه کاربر TOTP رو تو Fortify تأیید کرده باشه، تأیید لینک جادویی واردش نمیکنه؛ بهجاش بدون احراز هویت به چالش دومرحلهای Fortify هدایت میشه، پس هیچ مسیری نیست که یه کلیک روی لینک، عامل دوم رو دور بزنه. برای کلاینتهای SPA و موبایل هم کافیه api.enabled رو true کنی تا endpointها بهجای هدایت مرورگر، یه پاسخ JSON برگردونن که توش وضعیت احراز هویت، فعال بودن مرحلهٔ دوم و آدرس ادامهٔ کار مشخص شده تا کلاینت بفهمه رو کدوم شاخه افتاده.
نویسنده میگه اگه بخوای خودت لینک یا کد رو از راه پیامک، push یا mailable خودت بفرستی، facade پکیج بدون اینکه چیزی بفرسته این اعتبارها رو صادر میکنه:
use EmailMagicLink\Facades\EmailMagicLink;
$link = EmailMagicLink::issueLink($user);
$link->url; // Signed confirmation URL
$link->expiresAt; // Carbon instance
$code = EmailMagicLink::issueCode($user);
$code->code;برای جلوگیری از فشار روی دکمهٔ ارسال مجدد هم یه ResendGuard داره که cooldown پلهای (۳۰، بعد ۶۰، بعد ۱۲۰ ثانیه) بهعلاوهٔ سقف چرخشی پنج ارسال در ساعت اعمال میکنه، و توکنهای منقضی با یه دستور زمانبندیشده پاک میشن. خود پکیج به PHP 8.4 و Laravel 13 نیاز داره و Fortify اختیاریه.
نکات کلیدی:
- احراز هویت بدون رمز با لینک ایمیلی یا کد یهبارمصرف، مستقل یا کنار Fortify
- لینک در برابر اسکنرهای ایمیل مقاومه چون توکن فقط با یه POST صریح مصرف میشه
- توکنها فقط بهصورت هش HMAC-SHA256 ذخیره میشن و هر کدوم قفل brute-force جدا دارن
- کاربرهای TOTP بدون دور زدن، به چالش دومرحلهای Fortify هدایت میشن
- نیازمند PHP 8.4 و Laravel 13، بدون وابستگی اضافهٔ زمان اجرا




