Next.js同服务器调用NextAuth Credentials授权接口异常求助
问题背景
使用Next.js 13.5.4、next-auth 4.23.2及App Router目录结构,搭建了/api/validate路由接收外部POST请求,意图在该路由内调用NextAuth的Credentials授权路由完成登录验证。但获取CSRF Token后向/api/auth/callback/validate发起POST请求时,返回结果为前端HTML代码,并未触发authorize(credentials)方法执行验证逻辑。
问题原因
NextAuth的Credentials Provider回调路由默认**期望接收表单编码格式(application/x-www-form-urlencoded)**的请求数据,而非JSON格式。即使传入了redirect: false参数,若请求头和数据格式不匹配,NextAuth仍会默认重定向到登录页面,返回HTML内容。
修复方案
1. 调整请求数据格式与请求头
将请求体从JSON改为表单编码格式,并对应修改Content-Type请求头,同时确保redirect: false参数正确传递以禁止重定向。
2. 修改后的/api/validate路由代码
import axios from 'axios'; import qs from 'qs'; // 需安装qs库:npm install qs export async function POST(request: Request) { // 获取CSRF Token const tokenTemp = await axios.get(`${process.env.NEXTAUTH_URL}/api/auth/csrf`); // 用qs库将数据转为表单编码格式 const formData = qs.stringify({ csrfToken: tokenTemp.data.csrfToken, email: "gtest", password: "gtest", redirect: false, // 强制禁止重定向,返回JSON结果 }); try { const response = await axios({ method: 'post', url: `${process.env.NEXTAUTH_URL}/api/auth/callback/validate`, data: formData, headers: { 'Content-Type': 'application/x-www-form-urlencoded', // 匹配表单编码格式 } }); return Response.json(response.data); } catch (error) { return Response.json({ error: '验证失败' }, { status: 401 }); } }
3. NextAuth配置注意事项
保持现有Credentials Provider配置不变,但需注意:
- 确保Provider的
id为"validate",与回调路由后缀/validate一致 authorize方法内的验证逻辑中,当前仅email: "gtest1"且password: "gtest1"能通过验证,测试时需使用对应账号密码- 保留
session.strategy: "jwt"配置以维持JWT会话管理逻辑
内容的提问来源于stack exchange,提问作者jakobinn
相关产品推荐
相关产品推荐

