Middleware احراز هویت در Next.js: الگوی تمیز بدون باگ
نویسنده: آرش لطیفی
آموزش عملی پیادهسازی احراز هویت با Middleware در Next.js — تشخیص سشن، محافظت از مسیرها، ریدایرکت هوشمند و مدیریت توکن بدون نشت به کلاینت.
خلاصه: احراز هویت را در
middleware.tsمتمرکز کنید؛ با یک تابعisAuthenticatedو لیست مسیرهای محافظتشده، ریدایرکت و رفرش توکن را تمیز و بدون تکرار در هر صفحه مدیریت کنید.
چرا Middleware برای Auth
چک کردن سشن در هر page.tsx تکراری و خطاپذیر است. middleware.ts قبل از رندر روی Edge اجرا میشود، پس میتواند درخواست را زود رد یا هدایت کند، cookie را بخواند و حتی توکن را رفرش کند. این یعنی یک جا برای همه قوانین و بدون نشت منطق به کامپوننت.
اگر مرز کلاینت و سرور برایتان مهم است، مرور آلودگی RSC و مرز use-client و کش و PPR در Next.js 15 کمک میکند بفهمید چه چیزی باید در middleware بماند و چه چیزی در Server Actions.
اسکلت تمیز middleware.ts
یک فایل middleware.ts در ریشه پروژه بسازید و مسیرها را جدا تعریف کنید:
نکته: matcher فایلهای استاتیک را حذف میکند تا Edge بیهوده درگیر نشود.
رفرش توکن و کوکی امن
توکن کوتاهمدت + رفرشتوکن امنترین ترکیب است. در middleware فقط اعتبارسنجی سبک انجام دهید؛ رفرش سنگین را به route handler بسپارید:
کوکی را همیشه httpOnly و secure بگذارید و هرگز توکن را در localStorage نگه ندارید. برای بهینهسازی تصویر و داراییها، راهنمای بهینهسازی تصویر Next.js را ببینید تا ریدایرکتها با کش تصویر تداخل نکند.
جدول تصمیم ریدایرکت
| وضعیت کاربر | مسیر درخواستی | رفتار Middleware | کد |
|---|---|---|---|
| مهمان | /dashboard | ریدایرکت به /login?next=/dashboard | 307 |
| مهمان | /login | اجازه ورود | 200 |
| لاگینشده | /login | ریدایرکت به /dashboard | 307 |
| لاگینشده | /dashboard | اجازه + هدر x-user-id | 200 |
برای لاگینشدهای که به /login میرود، ریدایرکت معکوس تجربه را تمیز میکند:
چکلیست امنیتی قبل از دیپلوی
- [x]
AUTH_SECRETدرenvست شده و در گیت نیست - [x] کوکی
httpOnly,secure,sameSite=laxدارد - [ ] مسیرهای
publicوprotectedدقیق لیست شدهاند - [ ] ریدایرکت
nextفقط به مسیر داخلی مجاز است (جلوگیری از open redirect) - [ ] لاگ خطا بدون نشت توکن
مینیکیس: یک پنل سفارش برای فروشگاه تهرانی، قبلا چک لاگین را در هر صفحه کپی کرده بود؛ با انتقال به middleware، ۱۲۰ خط کد تکراری حذف شد، باگ «کاربر لاگینشده دوباره به لاگین میرود» حل شد و زمان پاسخ Edge حدود ۱۲ میلیثانیه کمتر شد.
FAQ
Q: منطق سنگین را در Middleware بگذاریم؟
نه. middleware روی Edge است و باید سبک بماند؛ فقط چک کوکی و ریدایرکت. اعتبارسنجی سنگین، دیتابیس و رفرش را به Route Handler یا Server Action بسپارید.
Q: چطور open redirect را ببندیم؟
پارامتر next را فقط اگر با / شروع شد و شامل // یا http نبود بپذیرید؛ در غیر این صورت به /dashboard بفرستید. هرگز مقدار خام کاربر را مستقیم در redirect نگذارید.
Q: با next/image تداخل دارد؟
اگر matcher درست باشد نه. الگوی !/ _next/static و !/_next/image را حتما در config.matcher بگذارید تا درخواستهای تصویر از middleware عبور نکنند و کش خراب نشود.