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

使用NextJs无法登录Laravel API,但Postman可正常访问

解决Laravel Sanctum + NextJS 登录接口419错误问题

核心原因

419错误本质是CSRF令牌验证失败,跨域场景下NextJS请求未正确处理Laravel Sanctum的CSRF令牌机制,同时Cookie凭证未正确传递。

解决方案

一、Laravel后端配置调整

  1. 修改CORS配置
    编辑config/cors.php,确保允许前端域名并开启凭证支持:
return [
    'paths' => ['api/*', 'sanctum/csrf-cookie'],
    'allowed_methods' => ['*'],
    'allowed_origins' => ['http://localhost:3000'], // 你的NextJS地址
    'allowed_origins_patterns' => [],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 0,
    'supports_credentials' => true, // 必须设为true,允许跨域传递Cookie
];
  1. 配置Sanctum支持有状态域名
    编辑config/sanctum.php,将NextJS域名加入stateful数组:
return [
    'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
        '%s%s',
        'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
        env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : ''
    ))),
    // 其他配置保持不变
];
  1. 更新环境变量
    编辑.env文件,设置共享Cookie的域名和Sanctum状态域名:
SESSION_DOMAIN=.localhost
SANCTUM_STATEFUL_DOMAINS=localhost:3000
APP_URL=http://localhost:8000

二、NextJS前端请求调整

必须先获取Sanctum的CSRF令牌Cookie,再发送登录请求,同时开启凭证传递:

// 第一步:获取CSRF令牌Cookie
await fetch('http://localhost:8000/sanctum/csrf-cookie', {
  credentials: 'include', // 必须开启,保存Cookie到浏览器
});

// 第二步:发送登录请求
const loginResult = await fetch('http://localhost:8000/api/login', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  credentials: 'include', // 传递Cookie,包含CSRF令牌和后续的JWT Cookie
  body: JSON.stringify({
    email: values.email,
    password: values.password,
  }),
});

const data = await loginResult.json();
// 根据返回结果处理登录逻辑

三、额外检查点

  • 确认Laravel的API路由是否被正确加载到api中间件组(默认routes/api目录下的路由都会自动加入)
  • 清除Laravel缓存:执行php artisan config:clear和php artisan cache:clear使配置生效
  • 重启Laravel服务和NextJS开发服务器,确保配置更新生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:35:20