การป้องกันเส้นทางด้วยมิดเดิลแวร์
ใช้มิดเดิลแวร์ของ Next.js และการเรียกกลับการยืนยันตัวตน เพื่อเปลี่ยนเส้นทางผู้ใช้ที่ยังไม่ได้ยืนยันตัวตนที่เอดจ์
การป้องกันเส้นทางด้วยมิดเดิลแวร์ เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
มิดเดิลแวร์ของ Next.js คืออะไร
มิดเดิลแวร์จะทำงานที่เอดจ์ก่อนที่คำขอจะไปถึงเส้นทาง มิดเดิลแวร์สามารถเปลี่ยนเส้นทาง เขียนเส้นทางใหม่ หรือเพิ่มส่วนหัวได้ จึงเหมาะสำหรับการตรวจสอบสิทธิ์โดยไม่ต้องโหลดคอมโพเนนต์ฝั่งเซิร์ฟเวอร์
การสร้างมิดเดิลแวร์
สร้าง middleware.ts ที่โฟลเดอร์รากของโครงการ ส่งออกฟังก์ชัน middleware และตัวจับคู่ config
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const token = request.cookies.get('auth-token')?.value;
if (!token) {
return NextResponse.redirect(new URL('/login', request.url));
}
return NextResponse.next();
}
export const config = {
matcher: ['/dashboard/:path*', '/profile/:path*'],
};รูปแบบตัวจับคู่เส้นทาง
อาร์เรย์ matcher ใช้รูปแบบเส้นทาง ใช้ :path* สำหรับเส้นทางย่อยใด ๆ หรือยกเว้นเส้นทางด้วยการมองไปข้างหน้าแบบปฏิเสธ
export const config = {
matcher: [
// Protect all routes except public ones:
'/((?!login|register|_next|api/auth|favicon.ico).*)',
],
};การผสานรวมมิดเดิลแวร์ของ Auth.js
Auth.js (v5) มีการส่งออกมิดเดิลแวร์ที่พร้อมใช้งานให้แล้ว โปรดส่งออกซ้ำจาก middleware.ts พร้อมตัวจับคู่
// middleware.ts
export { auth as middleware } from '@/auth';
export const config = {
matcher: ['/dashboard/:path*', '/settings/:path*'],
};การตรวจสอบ JWT ในมิดเดิลแวร์
ตรวจสอบโทเค็น JWT ในมิดเดิลแวร์โดยใช้ไลบรารี jose ซึ่งใช้งานร่วมกับเอดจ์ได้ และไม่ต้องใช้โมดูลการเข้ารหัสของ Node.js
import { jwtVerify } from 'jose';
export async function middleware(request: NextRequest) {
const token = request.cookies.get('token')?.value;
if (!token) return NextResponse.redirect(new URL('/login', request.url));
try {
await jwtVerify(token, new TextEncoder().encode(process.env.JWT_SECRET));
return NextResponse.next();
} catch {
return NextResponse.redirect(new URL('/login', request.url));
}
}มิดเดิลแวร์ตามบทบาท
อ่านบทบาทของผู้ใช้จากโทเค็น แล้วเปลี่ยนเส้นทางไปยังหน้าที่ไม่ได้รับอนุญาตหากบทบาทนั้นมีสิทธิ์ไม่เพียงพอ
const { payload } = await jwtVerify(token, secret);
if (request.nextUrl.pathname.startsWith('/admin') && payload.role !== 'admin') {
return NextResponse.redirect(new URL('/unauthorized', request.url));
}การส่งข้อมูลไปยังตัวจัดการเส้นทาง
กำหนดส่วนหัวของคำขอภายในมิดเดิลแวร์ เพื่อส่งข้อมูลผู้ใช้ที่ถอดรหัสแล้วไปยังคอมโพเนนต์ฝั่งเซิร์ฟเวอร์โดยไม่ต้องดึงโทเค็นใหม่
const response = NextResponse.next();
response.headers.set('x-user-id', payload.sub as string);
response.headers.set('x-user-role', payload.role as string);
return response;
// In a Server Component:
import { headers } from 'next/headers';
const userId = headers().get('x-user-id');การเขียน URL ใหม่ในมิดเดิลแวร์
ใช้ NextResponse.rewrite() เพื่อแสดงหน้าอื่นสำหรับ URL โดยไม่เปลี่ยนแถบที่อยู่ของเบราว์เซอร์ ซึ่งมีประโยชน์สำหรับการทดสอบ A/B หรือแฟล็กฟีเจอร์
const isInExperiment = Math.random() > 0.5;
if (isInExperiment) {
return NextResponse.rewrite(new URL('/home-v2', request.url));
}ข้อมูลภูมิศาสตร์และ IP ในมิดเดิลแวร์
เข้าถึงข้อมูลภูมิศาสตร์ของคำขอและ IP จากออบเจ็กต์ NextRequest เพื่อเปลี่ยนเส้นทางหรือบล็อกตามภูมิภาค
const country = request.geo?.country ?? 'US';
if (country === 'XX') {
return NextResponse.redirect(new URL('/region-blocked', request.url));
}ประสิทธิภาพของมิดเดิลแวร์
มิดเดิลแวร์จะทำงานที่เอดจ์กับทุกคำขอที่ตรงตามเงื่อนไข จึงควรทำให้มีขนาดเล็กและทำงานเบา หลีกเลี่ยงการคำนวณที่หนักหรือการนำเข้าขนาดใหญ่ และใช้เฉพาะไลบรารีที่ทำงานร่วมกับเอดจ์ได้
การรวมเส้นทางที่ต้องตรวจสอบสิทธิ์กับเส้นทางสาธารณะ
รูปแบบที่ใช้กันทั่วไปคือ ป้องกันทุกเส้นทางยกเว้นรายการเส้นทางสาธารณะที่ระบุไว้และตรวจสอบก่อนตรรกะการตรวจสอบสิทธิ์
const PUBLIC_PATHS = ['/login', '/register', '/about'];
const isPublic = PUBLIC_PATHS.some(p => request.nextUrl.pathname.startsWith(p));
if (isPublic) return NextResponse.next();
// Auth check for non-public routes
const token = request.cookies.get('token')?.value;
if (!token) return NextResponse.redirect(new URL('/login', request.url));ตรวจสอบความเข้าใจ
ควรใช้ไลบรารีใดเพื่อตรวจสอบ JWT ภายในมิดเดิลแวร์ของ Next.js แทนโมดูลการเข้ารหัสของ Node
สรุปทบทวน
สร้าง middleware.ts ที่โฟลเดอร์รากของโครงการพร้อมการตั้งค่า matcher ตรวจสอบโทเค็นการตรวจสอบสิทธิ์ด้วย jose ที่ทำงานร่วมกับเอดจ์ได้ เปลี่ยนเส้นทางผู้ใช้ที่ยังไม่ได้ตรวจสอบสิทธิ์ และส่งข้อมูลที่ถอดรหัสแล้วไปยังคอมโพเนนต์ฝั่งเซิร์ฟเวอร์ผ่านส่วนหัวการตอบกลับ ทำให้มิดเดิลแวร์ทำงานรวดเร็วและมีการพึ่งพาไลบรารีน้อย
คำถามที่พบบ่อย
บทเรียน “การป้องกันเส้นทางด้วยมิดเดิลแวร์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การป้องกันเส้นทางด้วยมิดเดิลแวร์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การป้องกันเส้นทางด้วยมิดเดิลแวร์”
ใช้มิดเดิลแวร์ของ Next.js และการเรียกกลับการยืนยันตัวตน เพื่อเปลี่ยนเส้นทางผู้ใช้ที่ยังไม่ได้ยืนยันตัวตนที่เอดจ์ คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การป้องกันเส้นทางด้วยมิดเดิลแวร์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การตั้งค่า Auth.js ใน Next.js App Router
- การจัดการเซสชันและฮุก useSession
- ผู้ให้บริการข้อมูลรับรองและการเข้าสู่ระบบแบบกำหนดเอง
- การป้องกันเส้นทางด้วยมิดเดิลแวร์