corbosman/laravel-passport-claims

向Laravel Passport JWT令牌添加声明

6.0.0 2024-03-15 01:29 UTC

README

Latest Version on Packagist Total Downloads build license

此包允许您向Laravel Passport JWT令牌添加声明。如果您有任何问题或评论,请创建一个问题。

安装

此包仅支持Laravel 9和10。您可以尝试使用此包的旧版本,但不提供支持。

通过Composer

composer require corbosman/laravel-passport-claims

用法

此包通过类管道发送AccessToken类以收集所有声明,类似于laravel中间件的工作方式。每个类都会向令牌添加一个声明。对于您想要添加的每个声明,您需要创建一个类似于以下示例的类。当然,您也可以在单个类中添加多个声明。

您可以使用Artisan命令为您生成一个类。只需提供从应用文件夹根目录的路径。以下示例将创建一个类app/Claims/CustomClaim.php

php artisan claim:generate Claims/CustomClaim
<?php
namespace App\Claims;
use CorBosman\Passport\AccessToken;  // extends Laravel\Passport\Bridge\AccessToken

class CustomClaim
{
    public function handle(AccessToken $token, $next)
    {
        $token->addClaim('my-claim', 'my custom claim data');

        return $next($token);
    }
}

由于Passport AccessToken通过管道发送,因此您可以访问AccessToken类上的方法。如果您想从令牌中获取信息,这非常有用。例如,根据令牌用户标识查找用户数据。您可以查看AccessToken类以查看您可以使用的所有方法。

<?php

namespace App\Claims;

use App\User;
use CorBosman\Passport\AccessToken; // extends Laravel\Passport\Bridge\AccessToken

class CustomClaim
{
    public function handle(AccessToken $token, $next)
    {
        $user = User::find($token->getUserIdentifier());

        $token->addClaim('email', $user->email);

        return $next($token);
    }
}

配置

要告诉此包您要添加哪些声明,您需要发布配置文件并添加所有类列表。在安装此包后,运行以下命令来发布配置文件。

php artisan vendor:publish --provider="CorBosman\Passport\ServiceProvider"

配置文件看起来像这样。

<?php

return [
    /*
    |--------------------------------------------------------------------------
    | JWT Claim Classes
    |--------------------------------------------------------------------------
    |
    | Here you can add an array of classes that will each be called to add
    | claims to the passport JWT token. See the readme for the interface that
    | these classes should adhere to.
    |
    */
    'claims' => [
        App\Claims\MyCustomClaim::class,
        App\Claims\MyOtherCustomClaim::class
    ]
];

中间件

您可以在路由上设置一个中间件来检查特定声明的存在。将中间件添加到您的\App\Http\Kernel.php类中

    protected $routeMiddleware = [
        'claim' => \CorBosman\Passport\Http\Middleware\CheckForClaim::class,
    ];

然后将此中间件分配给路由。通常,您还会添加一个检查有效令牌的passport中间件。

Route::middleware(['client', 'claim:my-claim'])->get('my-protected-route', function () {
    return 'protected by claim';
});

您可以检查声明是否与特定值匹配。

Route::middleware(['client', 'claim:my-claim,foobar'])->get('my-protected-route', function () {
    return 'protected by claim with foobar as its value';
});

您还可以检查声明是否与多个值中的特定值匹配,只需使用|分隔值即可。

Route::middleware(['client', 'claim:my-claim,foo|bar'])->get('my-protected-route', function () {
    return 'protected by claim with foo or bar as its value';
});

格式化程序

此包还允许您配置自定义格式化程序。格式化程序可以用于修改现有声明。您甚至可以使用它们来添加声明。选择自定义格式化程序的一个常见原因是将JWT中的DateTime字段从浮点数更改为整数。由于库中的更改,JWT现在使用浮点值发行,这破坏了与其他几乎所有JWT库的兼容性。如果您遇到这个问题,只需将以下内容添加到passport-claims.php配置文件中即可

   'formatters' => [
        \Lcobucci\JWT\Encoding\UnifyAudience::class,
        \Lcobucci\JWT\Encoding\UnixTimestampDates::class,
    ]

这会将微秒格式化程序替换为旧的Unix时间戳格式化程序。当然,您也可以添加任何其他自定义声明格式化程序。

变更日志

有关最近更改的更多信息,请参阅变更日志

贡献

有关详细信息,请参阅contributing.md

安全

如果您发现任何安全相关的问题,请通过电子邮件发送给作者,而不是使用问题跟踪器。

鸣谢

许可证

有关更多信息,请参阅许可证文件