这是一个讲解 Next.js 认证模式的技能,适用于用户询问 Next.js 认证、NextAuth、Auth.js、中间件认证、受保护路由或会话管理时。
用途:梳理 Next.js 项目中的常见认证策略与实现方式。
主要能力:
- 认证库选型:对比 NextAuth.js(Auth.js)、Clerk、Lucia、Supabase Auth、自定义 JWT 的适用场景。
- NextAuth.js v5 设置:安装 npm install next-auth@beta;在 auth.ts 中通过 NextAuth 配置 providers(如 GitHub、Credentials),导出 handlers、auth、signIn、signOut;在 app/api/auth/[...nextauth]/route.ts 导出 GET、POST。
- 中间件保护:在 middleware.ts 中导出 auth 作为 middleware 并设置 matcher;或用 NextResponse 重定向未登录用户并携带 callbackUrl;也可结合 jose 的 jwtVerify 验证令牌。
- 获取会话:服务端组件用 auth() 并在无会话时 redirect;客户端组件用 useSession 判断 status。
- 会话提供者:用 SessionProvider 包裹应用(app/providers.tsx 并在 layout 使用)。
- 登录/登出组件:通过服务端 action 调用 signIn、signOut。
- 基于角色的访问控制:扩展 Session 类型加入 role,在 session 与 jwt 回调中传递 role,并据此限制组件渲染。
- 会话存储:JWT(无状态,存 cookie)或数据库会话(配合 PrismaAdapter 等)。
- 自定义登录页:读取 callbackUrl 后调用 signIn。
- 安全实践:生产使用 HTTPS、设置 HttpOnly/Secure/SameSite cookie、CSRF 保护(NextAuth 内置)、校验重定向 URL、用环境变量存密钥、认证接口限流、用 bcrypt 或 argon2 哈希密码。
限制:资料未提供具体版本兼容性、各库定价与平台要求,也未给出完整可运行项目,代码示例需结合自身项目调整。