You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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守卫识别。

  1. 添加自定义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');
  1. 前端流程调整
  • 前端先携带Bearer令牌调用/api/sync-web-session接口
  • 确保请求开启withCredentials(Vue/Axios中设置withCredentials: true),让后端的Session Cookie能被前端保存
  • 会话同步成功后,再跳转或请求/oauth/authorize路由,此时Web守卫会自动识别已登录的用户

方案二:重写Passport授权控制器,兼容API令牌

继承Passport的AuthorizationController,在授权逻辑前先通过API令牌验证用户,并自动创建Web会话,同时保留原有的授权流程。

  1. 创建自定义授权控制器
// 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);
    }
}
  1. 重写授权路由
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 04:58:23