ronakgolakiya/jwt-auth-artisan

Laravel和Lumen的JWT身份验证包

v1.0.0 2023-02-28 12:03 UTC

This package is auto-updated.

Last update: 2024-09-28 16:25:59 UTC


README

Build Test Status

Laravel和Lumen网络工匠的Token身份验证

JWT 是一种在各个服务之间验证API请求的绝佳解决方案。此包使 Laravel 和 Lumen 非常容易地使用 JWT。

为什么选择 JWT?

因为你有

microservices

这些需要相互验证以拒绝不良请求的需求

how bout no

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

yea baby

内容

设置

使用composer安装包

$ composer require ronakgolakiya/jwt-auth-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 来处理异常,可以将以下环境变量设置为自定义错误消息。 (有关使用异常处理器的信息,请参阅以下内容)

处理Token

创建Token

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

<?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,
                        ],
                ];
        }
}

然后在创建Token时简单传递该对象

<?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('[...]');
}

验证Token

验证JWT Token请求的最简单方法就是使用提供的中间件。

<?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");
        }
);

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

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

例如,在 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');
        }

        ...
    }
}

负载

一旦您有了Token,处理负载就很容易。

<?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);

        ...
    }
}