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
相关产品推荐
相关产品推荐

