Next.js项目部署后NextAuth登录出现401错误,本地正常
NextAuth Credentials Provider 生产环境401错误排查方案
针对本地认证流程正常、生产环境登录触发401并跳转到https://sub.domain.com/api/auth/error?error=的问题,以下是具体排查和修复步骤:
1. 强制检查环境变量配置
生产环境绝对不能使用默认密钥,这是JWT签名验证失败的高频原因:
- 确保
NEXTAUTH_SECRET和JWT_SECRET已配置为强随机字符串(可通过openssl rand -hex 32生成),两者值建议保持一致(NextAuth会优先读取jwt.secret)。 - 验证
APP_URL生产环境值:必须是完整的生产域名(如https://sub.domain.com),且协议为https(生产环境禁用http)。
2. 修复内部API调用逻辑
当前通过APP_URL拼接内部API地址,生产环境可能因网络或跨域问题导致请求失败,进而触发authorize报错:
将axios请求改为相对路径,无需依赖外部域名:
// 原代码 await axios.post(`${process.env.APP_URL}/api/auth/admin/login`, credentials) // 修改后 await axios.post('/api/auth/admin/login', credentials)
服务器端调用内部API时,相对路径会直接指向当前项目的API路由,避免环境变量配置错误。
3. 完善错误处理逻辑
当前authorize方法中,若axios请求失败且返回数据无message字段,会抛出undefined错误,导致NextAuth无法传递具体错误信息:
修改错误抛出逻辑,添加兜底默认值:
catch (err) { const errorMsg = (err as AxiosError<{ message: string }>).response?.data.message || '登录验证失败,请检查账号信息' throw new Error(errorMsg) }
修改后错误页面URL会携带具体错误信息,便于定位问题。
4. 临时开启Debug模式排查
将debug配置改为true,查看生产环境NextAuth日志,获取认证流程的详细输出:
debug: true, // 排查完成后改回false
日志会输出authorize是否成功、JWT生成状态、session回调异常等关键信息。
5. 移除不必要的Adapter配置
你使用的是Credentials Provider,认证逻辑依赖自定义API,PrismaAdapter未参与核心流程,若生产环境Prisma连接异常可能间接影响认证:
暂时注释adapter配置,测试登录是否恢复正常:
// adapter: PrismaAdapter(prisma), // 注释后测试
6. 验证回调函数数据完整性
检查jwt和session回调:
- 确保自定义API返回的
user/room对象包含id和role字段(否则会导致token缺失关键信息)。 - 确认
signIn回调始终返回true(当前配置已满足,但需排查无隐藏逻辑干扰)。
内容的提问来源于stack exchange,提问作者Ismail_Aj
相关产品推荐
相关产品推荐

