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

NextAuth登录函数重定向至/api/auth/error问题求助

NextAuth Credentials登录跳转错误页排查要点

以下是针对登录跳错误页问题,结合CredentialsProvider的常见坑整理的排查步骤:

  • 检查authorize函数返回逻辑
    验证成功时必须返回包含唯一标识(如id)的用户对象,验证失败时返回null(而非undefined或直接抛出未捕获错误)。示例:

    async authorize(credentials) {
      // 模拟验证逻辑
      const validUser = await checkCredentials(credentials);
      if (validUser) {
        // 必须返回带唯一标识的用户对象
        return { id: validUser.id, name: validUser.name, email: validUser.email };
      }
      // 验证失败返回null,NextAuth会触发错误跳转(可通过pages配置自定义跳转目标)
      return null;
    }
    
  • 强制设置session策略为jwt
    CredentialsProvider不支持默认的database session策略,必须显式指定为jwt:

    export const authOptions: NextAuthOptions = {
      providers: [CredentialsProvider({/* 你的配置 */})],
      session: {
        strategy: 'jwt' // 关键配置,缺失会导致session初始化失败
      }
    };
    
  • 在登录页手动处理登录结果,避免自动跳错误页
    调用signIn时设置redirect: false,自行处理成功/失败逻辑,示例:

    // ./app/account/login/page.tsx
    import { signIn } from 'next-auth/react';
    import { useRouter } from 'next/navigation';
    import { FormEvent } from 'react';
    
    export default function LoginPage() {
      const router = useRouter();
      const handleSubmit = async (e: FormEvent) => {
        e.preventDefault();
        const formData = new FormData(e.currentTarget);
        const credentials = {
          email: formData.get('email') as string,
          password: formData.get('password') as string
        };
    
        const result = await signIn('credentials', {
          ...credentials,
          redirect: false // 禁用自动跳转
        });
    
        if (result?.error) {
          // 在页面展示错误提示,比如设置状态显示给用户
          console.log('登录失败:', result.error);
        } else {
          // 登录成功后手动跳转
          router.push('/dashboard');
        }
      };
    
      return (
        <form onSubmit={handleSubmit}>
          <input type="email" name="email" placeholder="邮箱" required />
          <input type="password" name="password" placeholder="密码" required />
          <button type="submit">登录</button>
        </form>
      );
    }
    
  • 自定义错误跳转页
    在NextAuth配置中指定验证失败时跳回登录页,而非默认的系统错误页:

    export const authOptions: NextAuthOptions = {
      // ...其他配置
      pages: {
        error: '/account/login' // 验证失败时跳回登录页
      }
    };
    
  • 检查authorize中的异常捕获
    如果在authorize里调用外部API或数据库查询,必须捕获异常,避免未处理错误导致跳转失败:

    async authorize(credentials) {
      try {
        const res = await fetch('/api/internal/auth', {
          method: 'POST',
          body: JSON.stringify(credentials),
          headers: { 'Content-Type': 'application/json' }
        });
        const user = await res.json();
        if (res.ok && user) return user;
        return null;
      } catch (err) {
        console.error('验证过程出错:', err);
        return null;
      }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:03:28