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
相关产品推荐
相关产品推荐

