laravel 的jwt-laravel的jwt自定义payload

2025-04-01 0 7

Image

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;
}

}
```

三、注意事项

  1. 自定义Payload中的键名应该避免与JWT标准声明冲突;
  2. 敏感信息不要存入Payload中,因为即使加密了也存在一定的风险;
  3. 如果是采用第二种方式,在处理并发请求时要注意线程安全问题。

1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!cheeksyu@vip.qq.com
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有积分奖励和额外收入!
5.严禁将资源用于任何违法犯罪行为,不得违反国家法律,否则责任自负,一切法律责任与本站无关

源码下载