使用NextJs无法登录Laravel API,但Postman可正常访问
解决Laravel Sanctum + NextJS 登录接口419错误问题
核心原因
419错误本质是CSRF令牌验证失败,跨域场景下NextJS请求未正确处理Laravel Sanctum的CSRF令牌机制,同时Cookie凭证未正确传递。
解决方案
一、Laravel后端配置调整
- 修改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 ];
- 配置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) : '' ))), // 其他配置保持不变 ];
- 更新环境变量
编辑.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
相关产品推荐
相关产品推荐

