NextAuth.js Credentials登录redirect=false时signIn始终返回ok=true
NextAuth自定义登录页signIn返回ok=true问题解决
问题核心
你误解了signIn函数返回的ok字段含义:它仅代表请求本身成功完成(无网络异常、后端正常响应),和认证是否成功无关。当redirect=false时,即便authorize返回null(认证失败),只要请求没出错,ok就会是true,真正的认证失败信息会通过error字段返回。
解决方案
1. 基于error字段判断认证结果
修改登录逻辑,放弃依赖ok,改用error是否存在来判断认证状态:
async function onSubmit(event: React.FormEvent<HTMLFormElement>) { event.preventDefault(); const formData = new FormData(event.currentTarget); const email = formData.get("email"); const password = formData.get("password"); const { error } = await signIn("credentials", { email: email, password: password, redirect: false, }); if (error) { console.log("认证失败:", error); // 这里添加错误提示逻辑,比如显示"邮箱或密码错误" } else { console.log("认证成功"); // 这里处理成功后的逻辑,比如跳转至首页 } }
2. 优化authorize函数,抛出明确错误(可选)
在authorize中遇到认证失败场景时,抛出具体错误而非返回null,能让前端拿到更清晰的错误信息:
async authorize(credentials, req) { const loginEmail = credentials?.email; const loginPass = credentials?.password; // 校验必填参数 if (!loginEmail || !loginPass) { throw new Error("请完整填写邮箱和密码"); } const user = await prisma.user.findUnique({ where: { email: loginEmail } }); if (!user) { throw new Error("该邮箱未注册"); } if (user.password !== loginPass) { throw new Error("密码错误"); } return { id: String(user.id), email: user.email }; }
3. 确认SessionProvider作用范围
确保登录页被AuthProvider(即SessionProvider)包裹,保证signIn能和NextAuth后端正确通信。
补充说明
当redirect=true时,NextAuth会自动处理认证失败的跳转(返回登录页),所以你觉得功能正常;内置登录页也依赖这个跳转逻辑。但redirect=false时需要手动处理认证结果,核心是关注error字段而非ok。
内容的提问来源于stack exchange,提问作者xTankky
相关产品推荐
相关产品推荐

