</>
⌕
Mid #auth#session#data-access-layer#middleware#cookies

Triển khai authentication/authorization trong App Router đúng cách như thế nào?

⚡ Trả lời nhanh

Lưu session trong cookie httpOnly, secure, sameSite. Middleware chỉ kiểm tra sơ bộ (optimistic) để redirect; kiểm tra thật phải đặt gần dữ liệu, trong Data Access Layer, Route Handler và Server Action. Không kiểm tra auth trong layout vì layout không re-render khi điều hướng.

// lib/dal.ts
import "server-only";
import { cache } from "react";
import { cookies } from "next/headers";
import { redirect } from "next/navigation";

export const verifySession = cache(async () => {
  const token = (await cookies()).get("session")?.value; // Next 14: bỏ await
  const session = token ? await decrypt(token) : null;
  if (!session) redirect("/login");
  return session;
});

export async function getOrders() {
  const { userId } = await verifySession();
  return db.order.findMany({ where: { userId } }); // authz theo chủ sở hữu
}
  • Tầng 1 (middleware): đọc cookie, redirect nhanh, không gọi DB.
  • Tầng 2 (DAL): verifySession bọc cache của React để dedupe trong một request.
  • Tầng 3 (Server Action/Route Handler): kiểm tra lại, vì chúng là endpoint public.
  • Thư viện: Auth.js, Clerk, hoặc tự làm với JWT (jose) và cookie.
🃏 Ôn bằng flashcard