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):
verifySessionbọccachecủ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.