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

Laravel Passport OAuth2请求中$request->user()为空及未认证问题

Laravel Passport 踩坑:$request->user()返回null及"Unauthenticated"错误解决

一、先查核心配置

  • Kernel.php中间件要配对
    得确保\Laravel\Passport\Http\Middleware\CreateFreshApiToken::class在web中间件组里,同时auth:api这类Passport相关中间件要正确注册到$routeMiddleware:
    protected $routeMiddleware = [
        // 其他中间件...
        'auth:api' => \Illuminate\Auth\Middleware\Authenticate::class,
        'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class,
        'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class,
    ];
    
  • auth.php里api guard驱动必须是passport
    打开config/auth.php,找到guards下的api配置,driver一定要设为passport:
    'guards' => [
        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    ],
    

二、请求本身别出错

  • Authorization头格式不能错
    发起请求时必须带Authorization头,格式是Bearer 你的access_token,注意Bearer和token之间有个空格,少了空格直接认不出来。
  • 先确认token是有效的
    可以手动查一下token状态,排除过期或者被撤销的情况:
    use Laravel\Passport\Token;
    
    $token = Token::findTokenById($你的tokenID);
    if (!$token || $token->revoked || $token->expires_at->isPast()) {
        // 这token肯定没用了
    }
    

三、自定义中间件改改写法

你现在的中间件直接调$request->user()返回null,大概率是没指定guard导致的。改成明确指定api guard试试:

public function handle($request, $next, ...$scopes)
{
    // 明确用api guard取用户
    $user = $request->user('api');
    dd($user);
    
    // 要是没取到,直接返回未授权
    if (!$user) {
        return response()->json(['message' => 'Unauthenticated.'], 401);
    }
    
    return $next($request);
}

四、其他容易漏的点

  • 确认安装Passport时已经跑过php artisan passport:install生成加密密钥,没跑的话赶紧补
  • 路由要绑auth:api中间件,别绑成默认的auth(默认是web guard,不认api token)
  • 要是用SPA前端,得确保CreateFreshApiToken中间件配置好了,请求还要带X-CSRF-TOKEN头

内容的提问来源于stack exchange,提问作者Dávid Michalco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 21:51:14