You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 16:20:17