rbdwllr/psr-jwt

符合PSR 7规范的JSON Web Token中间件库。

3.0.0-alpha 2022-07-09 20:59 UTC

README

Build Status codecov Infection MSI StyleCI Latest Stable Version PHP Version Support Total Downloads

PSR-JWT是一个中间件库,允许您对包含在Web请求中的JSON Web Tokens进行授权。它是PSR-7和PSR-15兼容的,并且建立在ReallySimpleJWT之上。

该库还允许您生成JSON Web Tokens,并且符合PSR-7 / PSR-15的中间件可以添加到任何兼容的框架中,例如Slim PHP

有关JSON Web Tokens的更多信息,请阅读RFC 7519。有关如何将JSON Web Tokens传递到Web应用程序的更多信息,请阅读RFC 6750中的bearer token授权。

内容

设置

要安装此包,您需要安装Composer,然后运行composer init。完成此操作后,您可以通过命令行或通过编辑由composer init命令创建的composer.json文件来安装该包。

最后,您需要在PHP代码中引用Composer自动加载器,require 'vendor/autoload.php';。自动加载文件的位置取决于您的代码在哪里运行。请注意,一些框架已经为您引用了自动加载文件。

通过命令行使用Composer安装

composer require rbdwllr/psr-jwt

通过composer.json文件安装

"require": {
    "rbdwllr/psr-jwt": "^0.3"
}

基本用法

PsrJwt可以与任何PSR-7 / PSR-15兼容的框架一起使用。只需调用其中一个中间件工厂方法,它们将返回一个实例化中间件,该中间件公开两个方法,__invoke()process()。后者将与PSR-15兼容的框架一起工作,而前者将与旧的PSR-7兼容的框架一起工作。

// Will generate a text/html response if JWT authorisation fails.
\PsrJwt\Factory\JwtMiddleware::html('secret', 'tokenKey', 'body');

// Will generate an application/json response if JWT authorisation fails.
\PsrJwt\Factory\JwtMiddleware::json('secret', 'tokenKey', ['body']);

密钥:是用于哈希JSON Web Token签名的字符串。

令牌密钥:是从cookie、查询参数或请求体中检索JSON Web Token所需的关键字。但是,默认情况下,库会在授权头的bearer字段中查找令牌。如果使用bearer字段,则可以传递空字符串作为令牌密钥''

正文:是授权失败时希望在响应中返回的正文内容。例如,<h1>授权失败!</h1>

Slim PHP示例实现

要将中间件添加到Slim PHP中的路由,可以使用以下代码。

// Can be added to any routes file in Slim, often index.php.
require '../../vendor/autoload.php';

$app->get('/jwt', function (Request $request, Response $response) {
    $response->getBody()->write("JSON Web Token is Valid!");

    return $response;
})->add(\PsrJwt\Factory\JwtMiddleware::html('Secret123!456$', 'jwt', 'Authorisation Failed'));

生成JSON Web Token

PsrJwt为ReallySimpleJWT库提供了一个包装器。您可以通过调用内置的工厂方法来创建一个ReallySimpleJWT构建器的实例。

require 'vendor/autoload.php';

$factory = new \PsrJwt\Factory\Jwt();

$builder = $factory->builder();

$token = $builder->setSecret('!secReT$123*')
    ->setPayloadClaim('uid', 12)
    ->build();

echo $token->getToken();

解析和验证JSON Web Token

如果出于某种原因需要在正常的中间件授权流程之外解析或验证令牌,JWT工厂类提供了一个解析方法。

这将返回一个提供令牌解析和验证功能的Really Simple JWT解析类的实例。

require 'vendor/autoload.php';

$factory = new \PsrJwt\Factory\Jwt();

$parser = $factory->parser('token', 'secret');

$parser->validate();

$parsed = $parser->parse();

var_dump($parsed->getPayload());

有关创建、解析和验证令牌的更多信息,请阅读ReallySimpleJWT文档。

从请求中检索令牌

如果您想在正常的中间件授权流程之外从请求中检索JSON Web Token,可以使用请求辅助类。

它允许您检索令牌本身或仅访问令牌的有效负载或报头。

require 'vendor/autoload.php';

use PsrJwt\Helper\Request;

$helper = new Request();

// Will return a ReallySimpleJWT Parsed object.
$helper->getParsedToken($request, $tokenKey);

// Return the token header as an array.
$helper->getTokenHeader($request, $tokenKey);

// Return the token payload as an array.
$helper->getTokenPayload($request, $tokenKey);

高级用法

您不必使用上面解释的工厂方法来生成JWT授权中间件,可以直接实例化所有必要的类。这允许您配置自定义设置。

use PsrJwt\Handler\Html;
use PsrJwt\JwtAuthMiddleware;

$htmlHandler = new Html($secret, $tokenKey, $body);

$middleware = new JwtAuthMiddleware($htmlHandler);

处理程序

PsrJwt是为了与任何PSR-15兼容的处理程序一起工作而构建的。作为标准,它附带两个内置处理程序,一个是返回text/html响应的处理程序,另一个是返回application/json响应的处理程序。

您可以通过实例化它们并将它们传递给PsrJwt中间件来使用这些处理程序。

// Create Middleware with JSON handler.
use PsrJwt\Handler\Json;
use PsrJwt\JwtAuthMiddleware;

// The handler.
$jsonHandler = new Json($secret, $tokenKey, $body);

// The middleware.
$middleware = new JwtAuthMiddleware($jsonHandler);

创建自定义处理程序

要创建自己的处理程序,您需要做两件事。首先,创建一个实现Psr\Http\Server\RequestHandlerInterface接口的类interface。这需要您创建一个handle()方法,该方法接受一个Psr\Http\Message\ServerRequestInterface对象并返回一个Psr\Http\Message\ResponseInterface对象。

接下来,您需要扩展PsrJwt\Auth\Authorise类,因为这将使您能够访问JSON Web Token授权功能。完成此操作后,您将能够将您的处理程序传递给PsrJwt\JwtAuthMiddleware类,并将其集成到您希望使用的框架中。

// An example JWT Authorisation Handler.
use PsrJwt\Auth\Authorise;
use PsrJwt\JwtAuthMiddleware;
use Psr\Http\Server\RequestHandlerInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Nyholm\Psr7\Response;

class MyHandler extends Authorise implements RequestHandlerInterface
{
    public function __construct(string $secret, string $tokenKey)
    {
        parent::__construct($secret, $tokenKey);
    }

    public function handle(ServerRequestInterface $request): ResponseInterface
    {
        $auth = $this->authorise($request);

        return new Response(
            $auth->getCode(),
            [],
            'The Response Body',
            '1.1',
            $auth->getMessage()
        );
    }
}

// Add Handler to Middleware.
$middleware = new JwtAuthMiddleware(new MyHandler('secret', 'token-key'));

// Add Middleware to Slim PHP route.
$app->get('/my/route', function (ServerRequestInterface $request, ResponseInterface $response) {
    $response->getBody()->write("OK!");
    return $response;
})->add($middleware);

许可证

MIT

作者

Rob Waller

Twitter: @robdwaller