Laravel Passport如何通过API创建带PKCE的授权码授予客户端
实现场景
正在Laravel Passport中实现*带PKCE的授权码授予(Authorization Code Grant with PKCE)*流程,根据官方文档说明,需要执行以下命令创建客户端:php artisan passport:client --public
手动执行该命令没有问题,但需要实现客户端的自动创建功能:计划给用户提供控制台页面,让用户可以自行创建自己的客户端。为此需要从前端通过Ajax(或fetch)调用Laravel Passport的端点来创建PKCE客户端,但暂时不清楚该调用哪个端点。
现存问题
Laravel Passport提供了POST /oauth/clients端点用于创建客户端,但这个端点只能创建普通授权码授予客户端(不带PKCE),不清楚该如何指定创建PKCE客户端,Password Grant Tokens客户端也存在同样的问题。
源码排查发现
查看Laravel Passport的客户端控制器源码后发现,原生逻辑无法指定想要的客户端类型,客户端控制器的store方法实现如下:
public function store(Request $request) { $this->validation->make($request->all(), [ 'name' => 'required|max:191', 'redirect' => ['required', $this->redirectRule], 'confidential' => 'boolean', ])->validate(); $client = $this->clients->create( $request->user()->getAuthIdentifier(), $request->name, $request->redirect, null, false, false, (bool) $request->input('confidential', true) ); if (Passport::$hashesClientSecrets) { return ['plainSecret' => $client->plainSecret] + $client->toArray(); } return $client->makeVisible('secret'); }
可以看到,客户端create()方法中部分参数是硬编码的,导致无法通过该JSON API创建其他类型的客户端。
另外查看Laravel Passport的客户端模型源码后发现,通过模型可以为客户端指定想要的授权类型,模型的类型转换配置如下:
protected $casts = [ 'grant_types' => 'array', 'personal_access_client' => 'bool', 'password_client' => 'bool', 'revoked' => 'bool', ];
这说明肯定存在为任意类型授权流程(比如PKCE)创建客户端的方式,但目前不清楚具体实现路径。
待解决的困惑
- 是否应该重写Laravel Passport的客户端控制器?具体该如何操作?
- 已知可以使用客户端模型在自定义端点中创建自己的客户端,但希望保留
POST /oauth/clients路由,因此需要重写Laravel Passport的客户端控制器,不清楚具体实现方法。
内容的提问来源于stack exchange,提问作者Carlos Tinnelly
相关产品推荐
相关产品推荐

