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

Laravel API中获取当前用户ID失败:Auth::user()返回null怎么办?

解决Laravel API中Auth::user()返回null的问题

我来帮你排查这个问题,在Laravel的API场景下Auth::user()返回null,通常是认证中间件、认证配置或请求信息这几个环节出了问题,咱们一步步解决:

1. 给API路由加上认证中间件

Laravel的routes/api.php里的路由默认只使用api中间件组,但这个组里默认不包含用户认证中间件。你需要手动给需要认证的路由加上auth:api(对应API认证守卫):

方式一:单个路由添加

// routes/api.php
use App\Http\Controllers\YourController;

Route::post('/your-store-endpoint', [YourController::class, 'store'])->middleware('auth:api');

方式二:控制器全局配置

如果这个控制器的所有方法都需要认证,可以在控制器构造函数里统一设置:

// app/Http/Controllers/YourController.php
public function __construct()
{
    $this->middleware('auth:api');
}

2. 确认API认证方案的配置正确

Laravel常用的API认证方案是Sanctum(轻量场景)或Passport(复杂OAuth场景),这里以最常用的Sanctum为例:

  • 确保你的用户模型引入了HasApiTokens trait:
// app/Models/User.php
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
    // ... 其他模型代码
}
  • 请求时必须携带认证令牌:

在Postman/前端请求中,添加Authorization请求头,格式为Bearer {用户令牌}

比如在Postman的Headers面板中添加:

Key: Authorization
Value: Bearer 1|abcdefghijklmnopqrstuvwxyz123456

3. 检查认证守卫配置

打开config/auth.php,确认guards里的api守卫配置正确指向你使用的认证驱动:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'sanctum', // 用Passport的话这里填'passport'
        'provider' => 'users',
        'hash' => false,
    ],
],

4. SPA场景额外配置

如果你的前端是同域SPA,还需要在config/cors.php里开启凭证支持:

'paths' => ['api/*', 'sanctum/csrf-cookie'],
'supports_credentials' => true,

并且前端要先请求/sanctum/csrf-cookie获取CSRF令牌,再发送业务请求。

最后,获取用户ID的正确方式

当以上配置都到位后,你就可以在store方法里正常获取用户ID了:

public function store(Request $request)
{
    // 三种等效方式任选其一
    $userId = Auth::id();
    // $userId = Auth::user()->id;
    // $userId = $request->user()->id;

    // 你的存储逻辑...
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:11:17