Laravel Sanctum+NextJs部署后出现CSRF Token Mismatch问题求助
Laravel Sanctum + Next.js 部署后「CSRF Token Mismatched」问题解决
问题情况
本地环境和Postman里所有功能正常,但部署到服务器后,Next.js(部署在admin.example.com子域名)登录时触发「CSRF Token Mismatched」错误,已在sanctum.php做了如下配置:
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( '%s%s%s', 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,localhost:8000::1,example.com, admin.example.ae', env('APP_URL') ? ',' . parse_url(env('APP_URL'), PHP_URL_HOST) : '', env('FRONTEND_URL') ? ',' . parse_url(env('FRONTEND_URL'), PHP_URL_HOST) : '' ))),
修复步骤
1. 修正Sanctum配置的格式错误
你的配置里有两个明显问题:
admin.example.ae前面多了空格,会导致域名识别失败localhost:8000::1格式错误,应该拆成localhost:8000,::1
建议直接在.env里明确设置SANCTUM_STATEFUL_DOMAINS,避免拼接出错:
SANCTUM_STATEFUL_DOMAINS=localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1,example.com,admin.example.com
然后sanctum.php可以简化成:
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', '')),
2. 配置Session共享域名
打开config/session.php,把domain设置为根域名(前面加.),让所有子域名能共享Cookie:
'domain' => '.example.com',
同时在.env里同步设置:
SESSION_DOMAIN=.example.com
3. 前端请求必须带Credentials和CSRF头
Next.js里要先请求/sanctum/csrf-cookie接口拿令牌,再发登录请求,并且确保请求开启credentials: 'include':
// 先获取CSRF Cookie await fetch('https://api.example.com/sanctum/csrf-cookie', { method: 'GET', credentials: 'include' }); // 登录请求 const xsrfToken = document.cookie.split('; ').find(row => row.startsWith('XSRF-TOKEN='))?.split('=')[1]; const response = await fetch('https://api.example.com/login', { method: 'POST', credentials: 'include', headers: { 'Content-Type': 'application/json', 'X-XSRF-TOKEN': decodeURIComponent(xsrfToken) }, body: JSON.stringify({ email: 'your-email@example.com', password: 'your-password' }) });
4. 清除服务器缓存
部署完配置后必须清缓存,不然Laravel会用旧配置:
php artisan config:clear php artisan cache:clear
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

