הרסתי את ה-Next.js Auth Matcher שלי שלוש פעמים

הרסתי שלושה פרויקטים לפני שהבנתי איך proxy.ts עובד ב-Next.js 16.

השגיאה הייתה שקטה. בלי לוגים. בלי אזהרות. בלי שגיאות. רק הפניות (redirects) שבורות ופרצות אבטחה.

אם אתם משדרגים ל-Next.js 16, אל תריצו סתם codemod ותמשיכו הלאה. אתם חייבים לבדוק את שלושת הדברים האלה.

מלכודת המעבר

Next.js שינתה את השם של middleware.ts ל-proxy.ts. זה לא רק שינוי שם.

אם תעדכנו את החבילה (package) באופן ידני ללא codemod, הקובץ הישן middleware.ts שלכם עשוי עדיין להתקיים. הוא יתקמפל מצוין. הוא יעבור את בדיקות ה-TypeScript. אבל הוא לא יעשה כלום. הנתיבים (routes) שלכם לא ייעצרו, וההפניות (redirects) שלכם לא יופעלו.

בדקו את שלושת הדברים האלה באופן ידני:

פער ה-Matcher

ה-matcher הוא המקום שבו הגדרות auth נכשלות הכי הרבה פעמים.

אם ה-matcher שלכם רחב מדי, ה-proxy ירוץ על כל קובץ CSS ותמונה. זה גורם ללולאות הפניה (redirect loops) אינסופיות.

אם ה-matcher שלכם צר מדי, אתם יוצרים פרצת אבטחה.

אם נתיב (route) לא נמצא ב-matcher שלכם, ה-proxy לעולם לא ירוץ. משתמש יכול לשלוח כותרות (headers) משלו לאותו נתיב. אם ה-Server Component שלכם סומך על הכותרות האלה, תוקף יכול להתחזות לכל אחד.

הפתרון: אל תסמכו על כותרות

למדתי את זה בדרך הקשה: אל תסתמכו אך ורק על כותרות (headers) המועברות על ידי ה-proxy.

השתמשו בגישה של שתי שכבות:

הבדיקה השנייה הזו סוגרת את הפער. גם אם ה-matcher מפספס נתיב, ה-Server Component יתפוס את המשתמש הלא תקף. זה מוסיף כמה מילישניות של השהיה (latency), אבל מונע כשל אבטחה מסיבי.

רשימת בדיקה מסכמת:

Source: https://dev.to/shubhradev/i-got-the-proxyts-matcher-wrong-for-three-projects-before-i-understood-why-4e5c