JWT 認証に Hyperf フレームワークを使用する方法

WBOY
リリース: 2023-10-24 12:36:23
オリジナル
1511 人が閲覧しました

JWT 認証に Hyperf フレームワークを使用する方法

JWT 認証に Hyperf フレームワークを使用する方法

はじめに:
Hyperf は、Swoole に基づく高性能コルーチン フレームワークであり、豊富な機能と柔軟性の拡張性を提供します。 。 JWT (JSON Web Token) は、情報の認証と送信のためのオープン標準です。この記事では、Hyperf フレームワークで JWT 認証を使用する方法を紹介し、具体的なコード例を示します。

1. 依存関係パッケージをインストールする
まず、hyperf/jwt および lcobucci/jwt 依存関係パッケージをインストールする必要があります。 Composer を通じてインストールでき、ターミナルを開いて次のコマンドを実行します:

composer require hyperf/jwt lcobucci/jwt
ログイン後にコピー

2. 認証情報の構成
Hyperf フレームワークで、JWT 認証に必要な関連情報を構成する必要があります。 config/autoload/jwt.php ファイルを開き、次の構成項目を追加します:

<?php

return [
    'default' => [
        'valid_seconds' => env('JWT_VALID_SECONDS', 3600), // Token有效期
        'secret' => env('JWT_SECRET', 'your-secret-key'), // 对称加密密钥
        'refresh_ttl' => env('JWT_REFRESH_TTL', 20160), // Token刷新有效期
        'password_key' => env('JWT_PASSWORD_KEY', 'password'), // 密码字段名称
        'blacklist_enabled' => env('JWT_BLACKLIST_ENABLED', true), // Token黑名单启用
        'blacklist_grace_period' => env('JWT_BLACKLIST_GRACE_PERIOD', 60), // Token宽限期
        'claim' => [], // 自定义Claims
    ],
];
ログイン後にコピー

3. JWT トークンの生成と解析
まず、JWT トークンを生成する必要があります。 HyperfJwtJwt クラスをコントローラーに導入し、make() メソッドを通じてトークンを生成します。サンプル コードは次のとおりです。

<?php

declare(strict_types=1);

namespace AppController;

use HyperfDiAnnotationInject;
use PsrHttpMessageResponseInterface;

class AuthController extends AbstractController
{
    /**
     * @Inject
     * @var HyperfJwtJwt
     */
    private $jwt;

    public function login(): ResponseInterface
    {
        // 对用户进行验证,验证通过后生成Token
        $userId = 1;
        $token = $this->jwt->make(['user_id' => $userId]);

        return $this->response->json([
            'token' => $token->toString(),
            'expires_at' => $token->getClaim('exp'),
        ]);
    }
}
ログイン後にコピー

次に、ミドルウェア内の JWT トークンを検証し、ユーザー情報を解析する必要があります。 HyperfJwtMiddlewareJwtMiddleware クラスをミドルウェアに導入し、検証と解析に handle() メソッドを使用します。サンプル コードは次のとおりです:

<?php

declare(strict_types=1);

namespace AppMiddleware;

use HyperfDiAnnotationInject;
use HyperfHttpServerContractRequestInterface;
use HyperfHttpServerContractResponseInterface as HttpResponse;
use HyperfUtilsContext;
use HyperfUtilsStr;
use HyperfJwtExceptionTokenValidException;
use HyperfJwtJwtInterface;
use PsrContainerContainerInterface;

class JwtMiddleware
{
    /**
     * @Inject
     * @var HyperfJwtJwt
     */
    private $jwt;

    /**
     * @var JwtInterface
     */
    private $jwtFactory;

    /**
     * @var RequestInterface
     */
    private $request;

    /**
     * @var HttpResponse
     */
    private $response;

    public function __construct(ContainerInterface $container, JwtInterface $jwt, RequestInterface $request, HttpResponse $response)
    {
        $this->jwtFactory = $jwt;
        $this->request = $request;
        $this->response = $response;
    }

    public function handle($request, Closure $next)
    {
        $token = Str::replaceFirst('Bearer ', '', $this->request->header('Authorization')); // 从Header中获取Token
        if (empty($token)) {
            throw new TokenValidException('Token not provided');
        }

        try {
            $token = $this->jwtFactory->parse($token); // 解析Token

            $claims = $token->claims(); // 获取Token中的声明
            Context::set('user_id', $claims->get('user_id')); // 设置用户ID到上下文
        } catch (TokenValidException $e) {
            throw new TokenValidException('Invalid token', $e->getCode(), $e);
        }

        return $next($request);
    }
}
ログイン後にコピー

4. 認証にミドルウェアを使用する
JWT 認証のルーティングにミドルウェアを使用します。 config/routes.php ファイルを開き、次のルーティングおよびミドルウェア構成項目を追加します。

<?php

use AppMiddlewareJwtMiddleware;

Router::addGroup('/api', function () {
    Router::post('/login', 'AppControllerAuthController@login');

    // 需要认证的路由
    Router::addGroup('/auth', function () {
        Router::get('/info', 'AppControllerAuthController@info');
    }, ['middleware' => [JwtMiddleware::class]]);
});
ログイン後にコピー

上記の例では、AppControllerAuthController@info には認証インターフェイスが必要です。このインターフェイスは、有効な JWT トークンを保持している場合にのみ正常にアクセスできます。

結論:
この記事では、JWT 認証に Hyperf フレームワークを使用する方法を紹介し、関連する構成とコードの例を示します。 JWT 認証により、Hyperf フレームワークでより高いセキュリティとユーザー認証機能を実現できます。この記事が、JWT 認証に Hyperf フレームワークを使用する際のお役に立てれば幸いです。

以上がJWT 認証に Hyperf フレームワークを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート