Laravel Sanctum+Next.js认证问题:登录后用户为空且加中间件无法访问
问题分析与解决方案
1. 修复控制器语法错误
你控制器里的response->json是语法错误,必须改为response()->json(缺少调用括号会导致代码执行失败,这可能是无法获取用户信息的潜在原因之一):
public function __invoke(Request $request){ $blog = Blog::where('id', $request->id)->first(); return response()->json([ 'blog' => $blog, 'user' => $request->user() ]); }
2. 确保前端请求携带认证凭证
Next.js请求Laravel Sanctum API时,必须正确携带会话Cookie和CSRF令牌,否则认证会直接失败:
- 先获取CSRF令牌:在登录或任何带状态的请求前,先调用
/sanctum/csrf-cookie接口,确保Cookie被浏览器正确设置。 - 请求时开启凭证携带:无论是用
axios还是fetch,都要明确设置允许携带凭证。
示例(Axios):
// 获取CSRF令牌 await axios.get('http://your-laravel-domain/sanctum/csrf-cookie', { withCredentials: true }); // 登录请求 await axios.post('http://your-laravel-domain/login', { email: 'user@example.com', password: 'password' }, { withCredentials: true }); // 请求博客接口 const response = await axios.get('http://your-laravel-domain/blog/1', { withCredentials: true });
示例(Fetch):
// 获取CSRF令牌 await fetch('http://your-laravel-domain/sanctum/csrf-cookie', { credentials: 'include' }); // 登录 await fetch('http://your-laravel-domain/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email: 'user@example.com', password: 'password' }), credentials: 'include' }); // 请求博客 const res = await fetch('http://your-laravel-domain/blog/1', { credentials: 'include' }); const data = await res.json();
3. 配置Sanctum与CORS
- 更新
.env配置:确保SANCTUM_STATEFUL_DOMAINS包含你的Next.js域名(多域名用逗号分隔):SANCTUM_STATEFUL_DOMAINS=http://localhost:3000 - 修改
config/cors.php:核心配置必须符合以下要求:return [ 'paths' => ['api/*', 'sanctum/csrf-cookie', 'login', 'blog/*'], 'allowed_methods' => ['*'], 'allowed_origins' => ['http://localhost:3000'], 'allowed_headers' => ['*'], 'supports_credentials' => true, // 必须设为true ];
4. 正确添加路由中间件
当上述配置和请求逻辑都验证正确后,再给路由添加auth:sanctum中间件,此时$request->user()就能正常返回登录用户信息:
Route::get('/blog/{id}', BlogController::class)->middleware('auth:sanctum');
排查要点
- 打开浏览器开发者工具,检查请求头是否包含
Cookie字段,且包含laravel_session和XSRF-TOKEN。 - 确认响应头存在
Access-Control-Allow-Credentials: true。 - 验证
/login接口返回200状态码,且登录后浏览器已存储对应Cookie。
内容的提问来源于stack exchange,提问作者japahen
相关产品推荐
相关产品推荐

