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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:42:50