如何使用Hyperf框架進行JWT認證
引言:
Hyperf是一款基于Swoole的高性能協程框架,提供了豐富的功能和靈活的擴展性。JWT(JSON Web Token)是一種用于認證和傳輸信息的開放標準。在本文中,我們將介紹如何在Hyperf框架中使用JWT認證,并提供具體的代碼示例。
一、安裝依賴包
首先,我們需要安裝hyperf/jwt和lcobucci/jwt依賴包。可以通過Composer進行安裝,打開終端運行以下命令:
composer require hyperf/jwt lcobucci/jwt
登錄后復制
二、配置認證信息
在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 ], ];
登錄后復制
三、生成和解析JWT Token
首先,我們需要生成JWT Token。在控制器中引入HyperfJwtJwt
類,并通過make()
方法生成Token。示例代碼如下:
<?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 Token并解析出用戶信息。在中間件中引入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); } }
登錄后復制
四、使用中間件進行認證
在路由中使用中間件進行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 Token時,才能成功訪問該接口。
結論:
本文介紹了如何使用Hyperf框架進行JWT認證,并提供了相關的配置和代碼示例。通過JWT認證,我們可以在Hyperf框架中實現較高的安全性和用戶驗證功能。希望本文對你在使用Hyperf框架進行JWT認證有所幫助。
以上就是如何使用Hyperf框架進行JWT認證的詳細內容,更多請關注www.92cms.cn其它相關文章!