Laravel 8 Passport Bearer Token认证失效 无中间件路由也触发鉴权跳转
问题解决方案
根因定位
你在app/Http/Kernel.php的api全局中间件组中直接加入了auth:api鉴权中间件,而Laravel默认所有定义在routes/api.php下的路由都会自动加载api中间件组,所以哪怕你没有给单个路由/路由组额外配置鉴权中间件,所有API请求都会触发全局鉴权逻辑,这就是无中间件配置的/greeting路由也会跳转redirectTo方法的核心原因。
修复步骤
- 修改
app/Http/Kernel.php的$middlewareGroups属性,移除api数组下的'auth:api'项,修改后配置如下:
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
调整后auth:api中间件只会作用于你手动配置了该中间件的路由组,不会全局生效。
补充请求头配置
请求API时务必携带Accept: application/json请求头,否则Laravel的鉴权中间件会判断当前请求为网页请求,校验不通过时触发redirectTo跳转逻辑,而不是返回符合API规范的401错误响应。可选优化(API场景适配)
可以修改app/Http/Middleware/Authenticate.php的redirectTo方法,适配API请求场景,避免不必要的跳转逻辑:
protected function redirectTo($request) { if (! $request->expectsJson()) { return route('login'); } }
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

