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

Next.js中NextAuth始终返回200状态码的问题求助

NextAuth 凭据认证异常解决方法

你遇到的问题核心是缺少凭据认证的核心验证逻辑,NextAuth 不会自动校验用户名密码,必须在配置中明确实现验证逻辑才能区分认证成功/失败。


1. 完善 CredentialsProvider 配置

在 NextAuth 的配置文件中,必须添加 CredentialsProvider 并实现 authorize 函数,这是校验用户名密码的核心逻辑:

import NextAuth from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";

export default NextAuth({
  pages: {
    signIn: "/login",
  },
  providers: [
    CredentialsProvider({
      name: "Credentials",
      credentials: {
        email: { label: "Email", type: "email" },
        password: { label: "Password", type: "password" },
      },
      // 关键:实现用户名密码校验逻辑
      async authorize(credentials) {
        // 示例:从数据库查询用户(替换成你的实际查询逻辑)
        const user = await fetchUserByEmail(credentials.email);
        
        // 用户不存在,返回 null 标记认证失败
        if (!user) return null;
        
        // 密码校验(生产环境必须用 bcrypt 等哈希对比,禁止明文)
        const isPasswordValid = await verifyPassword(credentials.password, user.hashedPassword);
        
        // 密码错误,返回 null 标记认证失败
        if (!isPasswordValid) return null;
        
        // 认证通过,返回用户信息(会传递给 jwt 回调)
        return { id: user.id, email: user.email, role: user.role, token: user.token };
      },
    }),
  ],
  callbacks: {
    async jwt({ token, user }) {
      if (user) {
        token.accessToken = user.token;
        token.role = user.role;
      }
      return token;
    },
    
    async session({ session, token }) {
      if (token) {
        session.accessToken = token.accessToken;
        session.role = token.role;
      }
      // 必须始终返回 session 对象,避免会话状态异常
      return session;
    },
  },
  // 显式声明会话策略为 JWT(凭据认证默认使用,但建议显式配置)
  session: { strategy: "jwt" },
});

2. 调整前端登录判断逻辑

当设置 redirect: false 时,不能仅通过 status === 200 判断认证结果,NextAuth 即使认证失败也可能返回 200 状态码,正确判断方式是检查 res.ok 和 res.error:

signIn("credentials", {
  email: values.email,
  password: values.password,
  redirect: false,
}).then((res) => {
  console.log(res);
  if (res.ok && !res.error) {
    toast.update(toastId, {
      render: "Login Success 🎉",
      type: "success",
      isLoading: false,
      autoClose: 2000,
      draggable: true,
      position: "top-right",
      closeButton: true,
    });
  } else {
    // 认证失败时显示错误提示
    toast.update(toastId, {
      render: res.error || "Login failed",
      type: "error",
      isLoading: false,
      autoClose: 2000,
      draggable: true,
      position: "top-right",
      closeButton: true,
    });
  }
});

关键注意事项

  • authorize 函数必须返回 null 表示认证失败,不要随意抛出错误(特殊场景除外)
  • 生产环境禁止明文存储/对比密码,必须使用 bcrypt 等哈希库处理
  • session 回调必须始终返回 session 对象,否则会导致会话状态异常

内容的提问来源于stack exchange,提问作者Jashandeep Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:23:15