bluemill/jwt-artisan

Laravel和Lumen的JWT认证包

0.1.8 2016-07-14 18:12 UTC

This package is not auto-updated.

Last update: 2024-09-21 09:51:49 UTC


README

注意:从https://github.com/generationtux/jwt-artisan分支而来,并更新以支持Laravel >= 6和PHP >= 7.2

Laravel和Lumen网络工匠的令牌认证

JWT是认证API请求之间各种服务的一个很好的解决方案。此包使Laravel和Lumen都能轻松地使用JWT。

为什么使用JWT?

因为你有

microservices

需要相互认证,以便可以拒绝不良请求,如

how bout no

这就是为什么JWT让你感觉像

yea baby

内容

设置

使用composer安装包

$ composer require generationtux/jwt-artisan

添加Laravel/Lumen的相应服务提供者

// Laravel
// config/app.php
'providers' => [
    ...
    GenTux\Jwt\Support\LaravelServiceProvider::class,
]

// Lumen
// bootstrap/app.php
$app->register(GenTux\Jwt\Support\LumenServiceProvider::class);

配置

此包的所有配置都可以使用环境变量设置。使用环境变量的原因是为了能够尽可能容易地将Laravel和Lumen集成在一起。请参阅下表以获取可用的配置选项及其默认值。

如果您正在使用JwtExceptionHandler来处理异常,则可以将这些环境变量设置为自定义错误消息。 (有关使用异常处理程序的信息,请参阅下文)

与令牌一起工作

创建令牌

GenTux\Jwt\JwtToken实例注入到您的控制器或其他服务中,以创建新令牌。

<?php

use GenTux\Jwt\JwtToken;

class TokensController extends controller
{
    public function create(JwtToken $jwt)
    {
        $payload = ['exp' => time() + 7200]; // expire in 2 hours
        $token = $jwt->createToken($payload); // new instance of JwtToken

        return (string) $token;
    }
}

实现GenTux\Jwt\JwtPayloadInterface,以便将其他对象传递给createToken以获得更动态的有效载荷。

<?php

use GenTux\Jwt\JwtPayloadInterface;

class User extends Model implements JwtPayloadInterface
{
    public function getPayload()
    {
        return [
            'sub' => $this->id,
            'exp' => time() + 7200,
            'context' => [
                'email' => $this->email
            ]
        ];
    }
}

然后在创建令牌时简单地传递该对象

<?php

use GenTux\Jwt\JwtToken;

class TokensController extends controller
{
    public function create(JwtToken $jwt)
    {
        $user = User::find(1);
        $token = $jwt->createToken($user);

        return $token->payload(); // ['sub' => 1, exp => '...', 'context' => ...]
    }
}

如果需要,您可以设置特定的secretalgorithm

public function create(JwtToken $jwt)
{
    return $jwt
            ->setSecret('secret_123')
            ->setAlgorithm('custom')
            ->createToken('[...]');
}

验证令牌

使用提供的中间件验证带有JWT令牌的请求是最简单的方法。

<?php

// Laravel
Route::group(['middleware' => 'jwt'], function() {
    Route::post('/foo', 'FooController');
});

// Lumen
$app->group(['middleware' => 'jwt', 'namespace' => 'App\Http\Controllers'], function($app)  {
    $app->post('/foo', 'FooController');
});

如果令牌无效,将抛出GenTux\Jwt\Exceptions\InvalidTokenException。如果没有提供令牌,则将抛出GenTux\Jwt\Exceptions\NoTokenException

要手动验证令牌,您可以使用具有GenTux\Jwt\GetsJwtToken特质的任何类来获取令牌。

例如,在Laravel请求对象中

<?php

use GenTux\Jwt\GetsJwtToken;

class CreateUser extends FormRequest
{
    use GetsJwtToken;

    public function authorize()
    {
        return $this->jwtToken()->validate();
    }
}

或在Lumen的控制器中

<?php

use GenTux\Jwt\GetsJwtController;

class FooController extends controller
{
    use GetsJwtToken;

    public function store()
    {
        if( ! $this->jwtToken()->validate()) {
            return redirect('/nope');
        }

        ...
    }
}

有效载荷

一旦您有了令牌,处理有效载荷就很容易。

<?php

use GenTux\Jwt\GetsJwtToken;

class TokenService
{

    use GetsJwtToken;

    public function getExpires()
    {
        $payload = $this->jwtPayload(); // shortcut for $this->jwtToken()->payload()

        return $payload['exp'];
    }
}

JwtToken的payload方法接受一个path,可以用来从有效载荷中获取特定数据。

<?php

use GenTux\Jwt\GetsJwtToken;

class TokenService
{
    use GetsJwtToken;

    public function getData()
    {
        // ['exp' => '123', 'context' => ['foo' => 'bar']]

        $token = $this->jwtToken();
        $token->payload('exp'); // 123
        $token->payload('context.foo'); // bar
        $token->payload('context.baz'); // null
    }
}

处理错误

如果需要,此包可以开箱即用地处理JWT异常。它将处理所有JWT异常并返回JSON错误响应。如果您想实现自己的错误处理,可以查看GenTux\Jwt\Exceptions\JwtExceptionHandler作为示例。

要实现,请将以下内容添加到app/Exceptions/Handler.php内部

<?php

use GenTux\Jwt\Exceptions\JwtException;
use GenTux\Jwt\Exceptions\JwtExceptionHandler;

class Handler extends ExceptionHandler
{
    use JwtExceptionHandler;

    public function render($request, Exception $e)
    {
        if($e instanceof JwtException) return $this->handleJwtException($e);

        ...
    }
}