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

NextAuth与Next.js中间件集成问题:登录后重定向异常

问题分析与解决方案

1. 缺失NextAuth Secret配置

JWT会话策略必须配置secret才能正确签名和验证会话令牌,缺失会导致中间件无法识别有效会话,进而持续重定向到登录页。

在你的[...nextauth].ts配置中添加secret字段,值从环境变量读取(推荐):

const options: NextAuthOptions = {
  secret: process.env.NEXTAUTH_SECRET, // 新增此行
  providers: [/* ...现有代码... */],
  // ...其余配置...
}

注意:需在.env.local文件中设置NEXTAUTH_SECRET,可通过openssl rand -hex 32生成随机密钥。

2. 确保Session包含用户唯一标识

NextAuth中间件依赖会话中的用户唯一标识(如id或email)确认认证状态。你的MongoDB用户模型使用_id作为主键,需在回调中明确传递该字段:

修改jwt和session回调:

callbacks: {
  jwt: async ({ token, user }) => {
    if (user) {
      // 将MongoDB的_id映射为id,兼容NextAuth默认字段
      token.id = user._id;
      token.user = {
        id: user._id,
        email: user.email,
        // 按需添加其他用户字段
      };
    }
    return token;
  },
  session: async ({ session, token }) => {
    if (token.id) {
      session.user.id = token.id;
      session.user.email = token.user.email;
    }
    return session;
  }
}

这样中间件能正确识别会话中的用户身份。

3. 检查登录页的signIn调用逻辑

确保登录页调用signIn时正确处理重定向,示例代码:

// 登录页处理逻辑
const handleLogin = async (e: FormEvent) => {
  e.preventDefault();
  await signIn('credentials', {
    email: email,
    password: password,
    redirect: true, // 登录成功后自动重定向至原访问页面
    callbackUrl: '/' // 或指定默认重定向地址
  });
};

若redirect设为false,需手动处理重定向逻辑,否则会停留在登录页。

4. 验证用户模型字段配置

确认User模型中,email字段默认暴露(Schema中无需设置select: false),password字段设置为隐藏(Schema中配置select: false),这样authorize方法中select("+password")才能正确获取密码进行比对。

内容的提问来源于stack exchange,提问作者akmal uiux

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 21:57:32