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

Next-auth登录无法捕获自定义错误,返回HTML而非JSON问题求助

解决NextAuth登录时无法捕获自定义错误的问题

问题根源

你在jwt回调中直接抛出错误,会触发NextAuth的内部错误处理逻辑,返回默认的错误HTML页面,而非包含自定义错误信息的JSON响应,导致前端解析JSON时出现语法错误。jwt回调的作用是处理Token生成/更新,并非用于验证用户登录合法性,在这里抛错不符合NextAuth的流程设计。

正确解决方案:在authorize阶段处理用户状态校验

authorize是验证登录凭证的核心阶段,在这里完成用户是否锁定的校验,抛出符合NextAuth规范的错误,才能让框架正确返回带自定义信息的JSON错误。

修改pages/api/auth/[...nextauth].tsx中的authorize函数

async authorize(credentials) {
  const { email, password } = credentials as {
    email: string
    password: string
  };

  // 1. 先完成邮箱密码验证
  try {
    const authResponse = await signInWithEmailAndPassword(auth, email, password);
    const { user } = authResponse;

    // 2. 调用接口检查用户是否锁定
    const checkResponse = await fetch(
      `${process.env.NEXTAUTH_URL}/api/rest?apiPath=current-user/${user.uid}`,
      {
        headers: {
          'X-API-KEY': apiKey,
          Accept: 'application/json',
        },
      }
    );

    // 根据你的逻辑,状态码200代表用户锁定
    if (checkResponse.status === 200) {
      // 抛出错误,NextAuth会将其转为标准错误响应
      throw new Error('user locked');
    }

    // 3. 若用户正常,返回用户信息
    return { id: user.uid, name: user.displayName, email: user.email };
  } catch (error) {
    // 捕获登录错误或自定义锁定错误,直接抛出即可
    throw error;
  }
}

前端捕获错误

使用signIn方法时,设置redirect: false以获取错误信息:

const handleLogin = async () => {
  const result = await signIn('credentials', {
    email: userEmail,
    password: userPassword,
    redirect: false,
  });

  if (result?.error) {
    // 这里可以直接拿到'user locked'错误信息,做前端提示处理
    alert(result.error);
  }
};

额外说明

如果必须在jwt回调中处理(比如Token刷新时检查用户状态),则需要自定义NextAuth错误处理逻辑,捕获回调中的错误并返回JSON响应,但这种场景更适合在authorize阶段完成初始校验,Token刷新时的错误可通过session回调返回无效状态,引导用户重新登录。

内容的提问来源于stack exchange,提问作者Pran R.V

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 22:37:44