Laravel Passport第三方授权:如何用API令牌调用/oauth/authorize
解决Laravel Passport授权路由兼容API令牌登录的问题
你的核心问题在于Laravel Passport默认的AuthorizationController依赖有状态的Web守卫(StatefulGuard),因为授权码流程需要通过Session存储授权状态(比如state参数)、用户授权确认信息等。直接替换成无状态的API令牌守卫会因为类型不匹配报错,重写路由加auth:api也无法满足控制器对Session的依赖。
下面是两种可行的解决方案:
方案一:通过API接口创建Web会话
先让前端调用一个自定义API接口,用已有的Bearer令牌验证用户身份,然后手动为用户创建Web会话,这样后续访问/oauth/authorize时就能被Web守卫识别。
- 添加自定义API路由
// routes/api.php use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; Route::post('/sync-web-session', function(Request $request) { // 用API守卫验证用户令牌 if (!Auth::guard('api')->check()) { return response()->json(['error' => '无效的令牌'], 401); } $user = Auth::guard('api')->user(); // 登录Web守卫,创建Session Auth::guard('web')->login($user); return response()->json(['message' => 'Web会话已同步']); })->middleware('auth:api');
- 前端流程调整
- 前端先携带Bearer令牌调用
/api/sync-web-session接口 - 确保请求开启
withCredentials(Vue/Axios中设置withCredentials: true),让后端的Session Cookie能被前端保存 - 会话同步成功后,再跳转或请求
/oauth/authorize路由,此时Web守卫会自动识别已登录的用户
方案二:重写Passport授权控制器,兼容API令牌
继承Passport的AuthorizationController,在授权逻辑前先通过API令牌验证用户,并自动创建Web会话,同时保留原有的授权流程。
- 创建自定义授权控制器
// app/Http/Controllers/OAuth/AuthorizationController.php <?php namespace App\Http\Controllers\OAuth; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Laravel\Passport\Http\Controllers\AuthorizationController as PassportAuthorizationController; class AuthorizationController extends PassportAuthorizationController { public function authorize(Request $request) { // 优先用API守卫验证用户 if (Auth::guard('api')->check()) { $user = Auth::guard('api')->user(); // 自动登录Web守卫,为授权流程准备Session Auth::guard('web')->login($user); } // 执行Passport原有的授权逻辑 return parent::authorize($request); } }
- 重写授权路由
在routes/web.php中覆盖Passport的默认授权路由,添加同时支持API和Web守卫的中间件:
Route::get('/oauth/authorize', [\App\Http\Controllers\OAuth\AuthorizationController::class, 'authorize']) ->middleware(['auth:api,web']);
这样前端携带Bearer令牌访问/oauth/authorize时,会先通过API守卫验证,自动创建Web会话后进入正常的授权流程;未携带令牌的用户则会走原有的Web登录流程。
注意事项
- 跨域场景下必须配置CORS允许
credentials,确保Session Cookie能正常传递 - 授权码流程依赖Session,所以无论哪种方案都需要确保Session可用,无法完全脱离Session完成授权流程
内容的提问来源于stack exchange,提问作者hretic
相关产品推荐
相关产品推荐

