babicaja / jwt-4laravel
这是一个提供所有简单JWT实现手段的Laravel包
Requires
- php: ^7.3
- ext-json: *
- illuminate/support: ^5.8
Requires (Dev)
- nunomaduro/phpinsights: ^1.2
- orchestra/testbench: ^3.5
- phpunit/phpunit: ^8.1
This package is auto-updated.
Last update: 2024-09-23 01:59:03 UTC
README
这是一个提供所有简单JWT实现手段的Laravel包
安装
请确保将此包作为您Laravel项目的一部分。您可以通过运行以下composer命令来完成此操作。
composer require babicaja/jwt-4laravel
入门
首先,使用artisan vendor:publish命令注册服务提供者。这将确保所有绑定都已就位,并将默认配置文件复制到您的应用程序配置文件夹中。
php artisan vendor:publish // Choose JWT4L\Providers\JWTServiceProvider from the list
检查新创建的config/jwt.php文件。目前,您可以保持它原样不变(别忘了在部署时更改secret密钥)。有关配置的详细信息请参阅本部分。
现在一切就绪,您可以使用JWT实现Laravel的功能。查看其功能的最佳方式是使用包提供的Token Facade和通过artisan tinker。如果您能看见以下类似的输出,说明您已经设置好了。
php artisan tinker Psy Shell v0.9.9 (PHP 7.3.6-1+ubuntu18.04.1+deb.sury.org+1 — cli) by Justin Hileman >>> Token::create() => "eyJ0eXAiOiJKV1QiLCJhbGciOiJzaGEyNTYifQ==.eyJpYXQiOiIyMDE5LTA3LTAyVDE1OjAyOjQ5LjkzMTQwMloiLCJleHAiOiIyMDE5LTA3LTAyVDE1OjE3OjQ5LjkzMTQ2M1oifQ==.fa0f19c3a2a444d72bb58feb54227677e52c65e35f3db21b31673520ddb16c86"
配置
默认情况下,配置文件带有默认值,您可以直接使用它们。您可能需要更改任何生产代码中的secret。您可以直接在config/jwt.php文件中设置值,或者更推荐的是设置适当的.env值。
config/jwt.php
<?php return [ 'algorithm' => env('JWT_ALG', 'sha256'), //hash_hmac_algos() 'expires' => env('JWT_EXP', 15), // minutes 'secret' => env('JWT_KEY', 'secret'), 'checks' => [ \JWT4L\Checks\Structure::class, \JWT4L\Checks\Signature::class, \JWT4L\Checks\Expired::class ] ];
-
算法
此值可以是PHP的
hash_hmac_algos()中任意算法。此处定义的算法用于签名和比较JWT签名。 -
过期
创建新令牌时,默认情况下会在
Payload部分添加一个exp声明。此处定义的分钟数将设置从创建时刻开始的过期日期。 -
密钥
此值与定义的
algorithm结合用于签名和比较JWT签名。 -
检查
您可以在其中添加自定义检查或选择使用默认选项之一。强烈建议使用默认选项,但您可以根据自己的意愿进行操作。
使用
有几种方式可以使用JWT for Laravel包
-
令牌外观
结合了
\JWT4L\Token\Generator、JWT4L\Token\Validator和\JWT4L\Token\Parser令牌管理器的功能。这使得用户可以在应用程序的任何地方通过一个接口创建、验证和解析JWT。令牌外观使用示例
$token = Token::create() // create a JWT $payload = Token::payload($token) // retrieve the Payload section from the JWT
-
令牌管理器
有三个令牌管理器
\JWT4L\Token\Generator负责JWT创建JWT4L\Token\Validator验证提供的JWT与Checks\JWT4L\Token\Parser解析JWT
所有令牌管理器都绑定到Laravel的服务容器,这使得您可以将它们注入构造函数或方法调用中。
令牌管理器使用示例
<?php namespace App\Http\Controllers; class TokenController extends Controller { public function generate(\JWT4L\Token\Generator $generator) { return response($generator->create()); } }
-
JWTGuard
该包提供了一个名为
JWTGuard的自定义Guard。Laravel的Auth将自动扩展此Guard,但您需要手动在config/auth.php中配置它。config/auth.php
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', 'hash' => false, ], 'jwt' => [ 'driver' => 'jwt', 'provider' => 'users', ], ],
现在,您可以使用
auth:jwt中间件将此Guard分配给任何路由。JWTGuard受保护的路线示例
Route::middleware('auth:jwt')->post('/user', function (Request $request) { return $request->user(); });
关于JWTGuard实现的注意事项。守护程序将尝试从提供的令牌的
sub(有效载荷)声明中提取用户标识符,因此您应确保负责创建令牌的逻辑按照以下示例设置此声明。自定义声明的示例
Token::withPayload(['sub'=>'user-identifier'])->create();
检查
该包提供了三个JWT检查功能
\JWT4L\Checks\Structure验证预期的header.payload.signature结构\JWT4L\Checks\Signature验证散列签名\JWT4L\Checks\Expired检查令牌是否已过期
您可以通过创建一个实现\JWT4L\Checks\CheckContract接口的类来自定义检查,并将其包含在config/jwt.php文件中。
app/Checks/Friday.php
<?php namespace app\Checks; use Carbon\Carbon; use JWT4L\Checks\CheckContract; class Friday implements CheckContract { /** * Do necessary checks and throw a specific exception if conditions are not met. * * @param string $token * @return void * @throws mixed */ public function validate(string $token) { if (!Carbon::now()->isFriday()) throw new \Exception("It's not Friday"); } }
config/jwt.php
<?php return [ 'algorithm' => env('JWT_ALG', 'sha256'), //hash_hmac_algos() 'expires' => env('JWT_EXP', 15), // minutes 'secret' => env('JWT_KEY', 'secret'), 'checks' => [ \JWT4L\Checks\Structure::class, \JWT4L\Checks\Signature::class, \JWT4L\Checks\Expired::class, \App\Checks\Friday::class ] ];
贡献
贡献者
非常欢迎您为此项目做出贡献。主要目标是保持简单,因为已经有很多具有高级功能的库。若要考虑您的贡献,请创建一个遵循以下指南的Pull Request。
# What's the purpose of this PR?
(Insert the description of the purpose of this change here)
# Impact Analysis
(What will this possibly affect?)
# Where should the tester start?
(Hints tips or tricks regarding how to test this, things to watch out for, etc)
# Any background context you want to provide?
(e.g. was this driven from expirience )
# What are the relevant tickets?
(Is this related to a ticket/bug at the moment?)
别忘了编写单元测试!所有贡献者都将被列出。