laravel 的jwt-laravel的jwt自定义payload
解决方案简述
在使用JWT(JSON Web Token)进行用户认证时,有时我们需要向Token中添加额外的信息,即自定义Payload。对于基于Laravel框架的项目而言,借助jwt-auth
扩展包可以较为方便地实现这一需求。下面将如何在laravel中通过jwt-laravel对jwt进行自定义payload。
一、安装jwt-auth
确保已经正确安装了jwt-auth
,可以通过Composer来完成安装:
shell
composer require tymon/jwt-auth:1.0.0-rc.5
然后发布配置文件并设置密钥:
php
php artisan vendor:publish --provider="TymonJWTAuthProvidersLaravelServiceProvider"
php artisan jwt:secret
二、自定义Payload的方式
1. 直接在登录时添加
这种方式是在创建Token的时候直接将需要的自定义信息加入到Payload中。
```php
use TymonJWTAuthFacadesJWTFactory;
use TymonJWTAuthFacadesJWTAuth;
public function login(Request $request)
{
// 获取用户输入的账号密码等信息
$credentials = $request->only('email', 'password');
if (! $token = JWTAuth::attempt($credentials)) {
return response()->json(['error' => 'invalid_credentials'], 401);
}
// 自定义payload数据
$customClaims = ['user_type' => 'admin'];//这里可以根据业务逻辑动态获取
// 创建自定义的token
$token = JWTFactory::sub($user->id)->setCustomClaims($customClaims)->make();
return response()->json(compact('token'));
}
```
2. 使用事件监听器
如果希望在每次生成Token时都自动添加某些固定信息,则可以考虑使用事件监听器的方式。
php
// 在EventServiceProvider中的boot方法里注册事件监听器
protected $listen = [
TymonJWTAuthEventsTokenCreated::class => [
AppListenersAddCustomClaimsToJwt::class,
],
];
然后创建相应的监听器类:
```php
namespace AppListeners;
use TymonJWTAuthFacadesJWTFactory;
use TymonJWTAuthContractsJWTSubject;
use TymonJWTAuthEventsTokenCreated;
class AddCustomClaimsToJwt
{
public function handle(TokenCreated $event)
{
/** @var JWTSubject $user */
$user = $event->user;
// 添加自定义信息
$customClaims = ['user_type' => 'member'];//根据实际情况调整
// 更新Token
$newToken = JWTFactory::sub($user->getJWTIdentifier())
->setCustomClaims(array_merge($event->token->getClaims(), $customClaims))
->make();
// 将新的Token赋值回去
$event->token = $newToken;
}
}
```
三、注意事项
- 自定义Payload中的键名应该避免与JWT标准声明冲突;
- 敏感信息不要存入Payload中,因为即使加密了也存在一定的风险;
- 如果是采用第二种方式,在处理并发请求时要注意线程安全问题。