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

Next.js同服务器调用NextAuth Credentials授权接口异常求助

解决NextAuth Credentials回调返回HTML而非触发authorize的问题

问题背景

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 22:47:34