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

如何修复NextAuth重定向至404错误的问题?

问题分析与解决方案

核心问题

点击登录按钮后跳转到http://localhost:3000/api/auth/signin?callbackUrl=http%3A%2F%2Flocalhost%3A3000%2Fauth%2Flogin,且[...nextauth].js未被调用,原因如下:


错误点与修正方案

1. signIn未传递用户凭证

调用signIn时只指定了redirect: false,但没有传入用户输入的email和password。NextAuth无法获取登录凭证,因此触发默认重定向逻辑,而非调用CredentialsProvider的authorize方法。

修正代码(登录页面onLogin函数):

const onLogin = async (e) => {
    e.preventDefault();
    setLoader(true);
    // 传入用户输入的邮箱和密码
    const result = await signIn("credentials", {
        redirect: false,
        email: values.email,
        password: values.password
    });
    setLoader(false);
    
    // 处理登录结果
    if (result?.error) {
        console.error("登录失败:", result.error);
        // 可在此添加前端错误提示,比如弹窗或文字提示
    } else if (result?.ok) {
        // 登录成功后跳转到目标页面
        router.push("/dashboard");
    }
};

2. [...nextauth].js中的环境错误

authorize方法里使用了浏览器端的alert(),但NextAuth的API路由运行在Node.js环境,该方法不支持,会导致报错,需替换为console.log()。

同时确保路由文件名是**pages/api/auth/[...nextauth].js**(注意是三个点、全小写),若文件名是[..NextAuth].js会导致Next.js无法匹配路由,API文件不会被调用。

修正后的[...nextauth].js代码:

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

const authOptions = {
    session: {
        strategy: "jwt"
    },
    providers: [
        CredentialsProvider({
            // 定义凭证字段,可选,用于生成默认登录表单
            credentials: {
                email: { label: "邮箱", type: "email" },
                password: { label: "密码", type: "password" }
            },
            async authorize(credentials, req) {
                console.log("已进入authorize函数,接收的凭证:", credentials);
                const { email, password } = credentials;

                // 模拟验证逻辑
                if (email !== "john@gmail.com" || password !== "1234") {
                    // 抛出错误,会被signIn的返回结果捕获
                    throw new Error("邮箱或密码错误");
                }

                // 返回用户信息,会被存入JWT和session
                return { email: "john@gmail.com", id: "1234", name: "John Doe" };
            }
        })
    ],
    pages: {
        signIn: "/auth/login"
    },
    // 可选:配置JWT和Session的回调,自定义存储内容
    callbacks: {
        jwt: async ({ token, user }) => {
            if (user) {
                token.id = user.id;
                token.email = user.email;
            }
            return token;
        },
        session: async ({ session, token }) => {
            if (token) {
                session.user.id = token.id;
                session.user.email = token.email;
            }
            return session;
        }
    }
};

export default NextAuth(authOptions);

3. 额外优化

  • 登录按钮的loader状态需在signIn调用前后正确切换,避免用户重复点击
  • 处理signIn的返回结果,给用户明确的登录状态反馈

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 03:07:25