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

如何在Laravel Passport用户授权后、令牌生成前添加事件?

实现思路

方法一:重写Passport的授权批准控制器

Laravel Passport的ApproveAuthorizationController负责处理用户授权操作,你可以通过重写该控制器的approve方法,在生成授权码后、完成响应前调用外部API:

  1. 创建自定义授权批准控制器,继承原控制器:
<?php

namespace App\Http\Controllers\Auth;

use Laravel\Passport\Http\Controllers\ApproveAuthorizationController as PassportApproveController;
use Illuminate\Http\Request;
use GuzzleHttp\Client;

class ApproveAuthorizationController extends PassportApproveController
{
    public function approve(Request $request)
    {
        // 执行原控制器的授权逻辑,生成授权码
        $response = parent::approve($request);

        // 调用外部API,按需传递用户、客户端等信息
        $client = new Client();
        $client->post('https://your-external-api-url.com/endpoint', [
            'form_params' => [
                'user_id' => $request->user()->id,
                'client_id' => $request->client_id,
            ]
        ]);

        return $response;
    }
}
  1. 替换Passport的默认路由绑定,在AuthServiceProvider的boot方法中添加:
use App\Http\Controllers\Auth\ApproveAuthorizationController;
use Laravel\Passport\Passport;

public function boot()
{
    $this->registerPolicies();

    Passport::routes(function ($router) {
        $router->forAuthorization();
        // 覆盖默认的授权批准路由
        $router->get('/authorize', [ApproveAuthorizationController::class, 'approve'])
            ->middleware(['auth', 'scope']);
        $router->post('/authorize', [ApproveAuthorizationController::class, 'approve'])
            ->middleware(['auth', 'scope']);
    });
}

方法二:监听Passport的AuthorizationCodeCreated事件

Passport在成功生成授权码时会触发AuthorizationCodeCreated事件,触发时机正好是用户授权后、授权码返回给客户端之前,完全匹配你的需求:

  1. 创建事件监听器:
php artisan make:listener HandleAuthorizationCodeCreated
  1. 在监听器中编写外部API调用逻辑:
<?php

namespace App\Listeners;

use Laravel\Passport\Events\AuthorizationCodeCreated;
use GuzzleHttp\Client;

class HandleAuthorizationCodeCreated
{
    public function handle(AuthorizationCodeCreated $event)
    {
        // 通过$event对象获取用户、客户端、授权码ID等信息
        $client = new Client();
        $client->post('https://your-external-api-url.com/endpoint', [
            'form_params' => [
                'user_id' => $event->user->id,
                'client_id' => $event->client->id,
                'code_id' => $event->codeId,
            ]
        ]);
    }
}
  1. 在EventServiceProvider中注册监听器:
protected $listen = [
    \Laravel\Passport\Events\AuthorizationCodeCreated::class => [
        \App\Listeners\HandleAuthorizationCodeCreated::class,
    ],
];

方法对比

  • 重写控制器:逻辑直接,适合需要修改授权响应内容的场景,但需要维护路由绑定。
  • 事件监听:符合Laravel事件驱动的设计理念,代码解耦性更强,推荐优先使用。

内容的提问来源于stack exchange,提问作者Denis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:45:30