如何在dusterio/lumen-passport生成的JWT Payload中添加自定义数据
dusterio/lumen-passport / laravel/passport 新增JWT自定义Payload字段方案
实现原理
Passport 底层基于 league/oauth2-server 实现OAuth2逻辑,我们可以通过替换默认的访问令牌仓库,在生成令牌环节注入自定义声明字段,直接写入JWT的Payload中,不需要修改原有生成token的业务代码。
具体操作步骤
步骤1:创建自定义访问令牌仓库类
新建app/Repositories/CustomAccessTokenRepository.php文件,代码如下:<?php namespace App\Repositories; use Laravel\Passport\Bridge\AccessTokenRepository as BaseRepository; use League\OAuth2\Server\Entities\ClientEntityInterface; class CustomAccessTokenRepository extends BaseRepository { public function getNewToken(ClientEntityInterface $clientEntity, array $scopes, $userIdentifier = null) { $accessToken = parent::getNewToken($clientEntity, $scopes, $userIdentifier); // 新增自定义Payload字段 $accessToken->addClaim('custom_data', 'this is a custom data.'); // 如需动态读取用户属性,可通过$userIdentifier查询用户模型后赋值 // $user = \App\Models\User::find($userIdentifier); // $accessToken->addClaim('user_nickname', $user->nickname); // $accessToken->addClaim('client_ip', request()->ip()); return $accessToken; } }步骤2:替换容器中的默认仓库绑定
在app/Providers/AuthServiceProvider.php的register方法中添加绑定逻辑,覆盖原生的令牌仓库实现:public function register() { $this->app->bind( \League\OAuth2\Server\Repositories\AccessTokenRepositoryInterface::class, \App\Repositories\CustomAccessTokenRepository::class ); }如果是Lumen框架没有AuthServiceProvider,也可以直接在
bootstrap/app.php中添加上述绑定代码。步骤3:验证效果
调用原有密码授权接口生成新的token,解码后即可看到Payload中已经存在新增的custom_data字段,原有业务逻辑无需修改。
内容的提问来源于stack exchange,提问作者aagjalpankaj
相关产品推荐
相关产品推荐

