Next.js 13集成Passport的API转换问题求助
适配Next.js 13 App Router的Passport本地认证方案
Next.js 13 App Router的API路由采用Web标准的Request/Response对象,不再兼容Node.js风格的req/res,因此无法直接沿用Next.js 12中基于next-connect的Passport中间件写法。以下是适配后的实现方案:
import { passport } from "@/lib/auth"; import { NextResponse } from 'next/server'; export async function POST(request) { // 解析请求体:根据前端提交格式选择JSON或formData解析 const { username, password } = await request.json(); // 若前端用表单提交,替换为: // const formData = await request.formData(); // const username = formData.get('username'); // const password = formData.get('password'); return new Promise((resolve, reject) => { // 使用Passport的回调模式替代中间件模式 passport.authenticate('local', (authErr, user, info) => { // 处理服务器内部错误 if (authErr) { return reject(authErr); } // 处理认证失败(用户名/密码错误) if (!user) { return resolve(NextResponse.json( { error: info?.message || '认证失败' }, { status: 401 } )); } // 此处添加会话创建逻辑(比如用iron-session管理用户会话) // 示例:await createUserSession(request, user); // 认证成功返回用户信息 resolve(NextResponse.json({ user })); })({ body: { username, password } }); // 模拟Passport所需的req对象结构 }); }
关键说明
- 改用回调模式:Passport的中间件模式依赖Node.js的
req/res,在App Router中无法直接使用,因此切换到回调模式手动处理认证结果。 - 手动解析请求体:根据前端实际提交的内容类型(JSON或表单),选择对应的解析方式获取用户名和密码。
- 会话管理适配:如果之前依赖next-connect处理会话,需要改用App Router兼容的会话方案(如
iron-session),在认证成功后创建用户会话。
内容的提问来源于stack exchange,提问作者Khalid
相关产品推荐
相关产品推荐

