Laravel API如何同时校验token有效性与web会话登录状态
问题根因
- Laravel 加载
auth:api中间件后,会将默认认证Guard切换为api,你直接调用Auth::check()实际校验的是apiguard的token有效性,不是web端会话的有效性 - 默认API路由组未挂载
StartSession中间件,就算指定web guard也无法读取到会话数据,无法正常校验web登录状态
修复步骤
1. 调整API路由中间件配置
给需要校验web会话的API路由组添加会话启动中间件,确保可以读取到laravel_session对应的数据,示例:
// routes/api.php Route::middleware([ \Illuminate\Session\Middleware\StartSession::class, // 先启动会话 \App\Http\Middleware\IsCharacterLoggedInMiddleware::class, // 再校验web登录状态 'auth:api' // 最后校验api token ])->group(function () { // 你的业务API路由 });
2. 修改自定义中间件校验逻辑
显式指定使用web guard做会话校验,不要使用默认Guard:
<?php class IsCharacterLoggedInMiddleware { public function handle($request, Closure $next, $guard = null) { // 显式用web guard校验会话有效性 if (!\Auth::guard('web')->check()) { // 会话失效后的逻辑,比如返回401错误 return response()->json(['message' => '会话已失效,请重新登录'], 401); } return $next($request); } }
注意事项
- 同站前端调用API时,需要正常携带Cookie和
X-CSRF-TOKEN请求头,否则会触发CSRF校验失败 - 如果API有跨域调用需求,需要单独配置CORS规则,同时将对应路由添加到
App\Http\Middleware\VerifyCsrfToken的例外列表中
内容的提问来源于stack exchange,提问作者TheWebs
相关产品推荐
相关产品推荐

