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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:27:38