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

Next-Auth Credentials Provider对接Laravel Sanctum返回419状态码问题

问题原因

你遇到的419错误核心原因是Next-Auth的authorize回调运行在Next.js服务端侧,而非用户浏览器端,和客户端请求的执行环境完全不同:

  • 客户端发起请求时,浏览器会自动存储Laravel返回的XSRF-TOKEN、laravel_session等Cookie,下次请求自动携带,所以请求正常。
  • 服务端运行的axios没有浏览器的全局Cookie存储机制,你调用apiClient.get("/sanctum/csrf-cookie")拿到的Set-Cookie响应头不会被自动缓存,后续的POST请求自然没有携带对应的CSRF Cookie和Token,Laravel校验不通过就返回419。
解决方案

1. 调整authorize回调逻辑,手动传递Cookie和CSRF Token

修改[...nextauth.js]中的授权逻辑,手动提取csrf cookie、传递到后续登录请求:

async authorize({email, password}, req) {
    // 第一步:请求CSRF Cookie,手动保存返回的Cookie和Token
    const csrfRes = await apiClient.get("/sanctum/csrf-cookie");
    // 兼容不同响应头大小写,提取所有Set-Cookie
    const cookies = csrfRes.headers['set-cookie'] || csrfRes.headers['Set-Cookie'];
    // 从Cookie中提取XSRF-TOKEN值并解码
    const xsrfToken = cookies
        .find(c => c.startsWith('XSRF-TOKEN='))
        .split(';')[0]
        .split('=')[1];
    const decodedXsrfToken = decodeURIComponent(xsrfToken);

    // 第二步:发起登录请求,手动携带Cookie和X-XSRF-TOKEN头
    const userRes = await apiClient.post('/customer/login', {
        email: email,
        password: password,
    }, {
        headers: {
            'Cookie': cookies.join('; '),
            'X-XSRF-TOKEN': decodedXsrfToken
        }
    });

    if (userRes.data) {
        return userRes.data
    } else {
        return null
    }
}

你原有的apiClient.js配置无需修改,withCredentials: true是正确的。

2. 确认Laravel端配置正确

检查以下配置项,避免跨域/会话配置错误:

  • .env文件中配置正确的状态域名,端口不能遗漏:
    SESSION_DOMAIN=localhost
    SANCTUM_STATEFUL_DOMAINS=localhost:3000 # 替换为你的Next.js实际访问地址
    SESSION_DRIVER=cookie
    
    生产环境如果前后端同根域名,例如前端是app.example.com、后端是api.example.com,需要把SESSION_DOMAIN改为.example.com。
  • config/cors.php中开启凭据支持:
    'supports_credentials' => true,
    'paths' => ['api/*', 'sanctum/csrf-cookie', 'customer/login'], // 确保你的路由在路径列表里
    'allowed_origins' => ['http://localhost:3000'], // 替换为你的Next.js地址
    

可选:无CSRF校验方案(不推荐生产环境使用)

如果确认是内部服务端通信,也可以直接在Laravel的app/Http/Middleware/VerifyCsrfToken.php中把登录相关路由加到例外列表,跳过CSRF校验:

protected $except = [
    'customer/login',
    // 其他需要跳过的路由
];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:06:03