如何使用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認證的詳細內容。更多資訊請關注PHP中文網其他相關文章!