Laravel 5.6 Passport API认证在GET请求中无法正常工作求助
解决Laravel Passport SPA认证失败问题
看起来你把CreateFreshApiToken中间件的用法和auth:api守卫的默认逻辑搞混了,我来帮你理清并解决这个问题:
核心问题
auth:api守卫默认使用passport驱动,它只认OAuth2的Bearer访问令牌(也就是请求头里的Authorization: Bearer xxx),而CreateFreshApiToken中间件是给已经通过web session登录的用户生成加密的laravel_tokencookie,让这类用户不用手动获取Bearer令牌就能访问API——但这个机制对应的是web守卫,不是默认配置的api守卫。
具体解决步骤
1. 调整路由中间件(最直接的方案)
如果你的SPA用户是通过Laravel的web登录流程(比如默认的登录页面)认证的,那把API路由的中间件从auth:api改成auth:web即可:
Route::get('categories','Api\Categories@index')->middleware('auth:web');
这样,已登录的web用户只要请求里带对X-CSRF-TOKEN、X-Requested-With头,并且浏览器里有有效的laravel_tokencookie,就能正常访问这个API接口。
2. 验证中间件顺序
确认CreateFreshApiToken在web中间件组里的位置——它必须放在session相关中间件之后,否则无法获取已认证的session用户。打开app/Http/Kernel.php检查:
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class, // 确保在这几个session中间件之后 ], ];
3. 检查请求的关键细节
- 确认你的SPA请求是AJAX类型:必须携带
X-Requested-With: XMLHttpRequest头,CreateFreshApiToken只会给这类请求生成laravel_tokencookie。 - 查看浏览器的Application标签:确认
laravel_tokencookie已经存在,并且域名、路径配置正确。 - 如果是跨域场景:要确保后端配置了CORS允许携带cookie,同时你的AJAX请求要开启
withCredentials(比如axios里设置axios.defaults.withCredentials = true)。
4. 若坚持使用auth:api守卫
如果你一定要用auth:api,那你得放弃CreateFreshApiToken的cookie机制,改用标准的OAuth2流程:
- 通过密码授权、客户端凭证授权等方式获取
access_token。 - 在请求头里添加
Authorization: Bearer {你的access_token},这样auth:api中间件才能识别并通过认证。
内容的提问来源于stack exchange,提问作者salin kunwar
相关产品推荐
相关产品推荐

