0Pricing
React Academy · บทเรียน

การป้องกันเส้นทางด้วยมิดเดิลแวร์

ใช้มิดเดิลแวร์ของ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตั้งค่า Auth.js ใน Next.js App Router
  2. การจัดการเซสชันและฮุก useSession
  3. ผู้ให้บริการข้อมูลรับรองและการเข้าสู่ระบบแบบกำหนดเอง
  4. การป้องกันเส้นทางด้วยมิดเดิลแวร์
← กลับไปที่ React Academy