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

