babicaja/jwt-4laravel

这是一个提供所有简单JWT实现手段的Laravel包

v1.2.2 2019-07-17 13:03 UTC

README

这是一个提供所有简单JWT实现手段的Laravel包

Latest Version on Packagist Total Downloads Build Status Coverage Licence

安装

请确保将此包作为您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\GeneratorJWT4L\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?)

别忘了编写单元测试!所有贡献者都将被列出。