如何在Laravel Passport用户授权后、令牌生成前添加事件?
实现思路
方法一:重写Passport的授权批准控制器
Laravel Passport的ApproveAuthorizationController负责处理用户授权操作,你可以通过重写该控制器的approve方法,在生成授权码后、完成响应前调用外部API:
- 创建自定义授权批准控制器,继承原控制器:
<?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; } }
- 替换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事件,触发时机正好是用户授权后、授权码返回给客户端之前,完全匹配你的需求:
- 创建事件监听器:
php artisan make:listener HandleAuthorizationCodeCreated
- 在监听器中编写外部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, ] ]); } }
- 在
EventServiceProvider中注册监听器:
protected $listen = [ \Laravel\Passport\Events\AuthorizationCodeCreated::class => [ \App\Listeners\HandleAuthorizationCodeCreated::class, ], ];
方法对比
- 重写控制器:逻辑直接,适合需要修改授权响应内容的场景,但需要维护路由绑定。
- 事件监听:符合Laravel事件驱动的设计理念,代码解耦性更强,推荐优先使用。
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

