Rumah > Artikel > rangka kerja php > Cara menggunakan rangka kerja Hyperf untuk pengesahan JWT
Cara menggunakan rangka kerja Hyperf untuk pengesahan JWT
Pengenalan:
Hyperf ialah rangka kerja coroutine berprestasi tinggi berdasarkan Swoole, menyediakan fungsi yang kaya dan kebolehskalaan yang fleksibel. JWT (JSON Web Token) ialah standard terbuka untuk mengesahkan dan menghantar maklumat. Dalam artikel ini, kami akan memperkenalkan cara menggunakan pengesahan JWT dalam rangka kerja Hyperf dan memberikan contoh kod khusus.
1. Pasang pakej kebergantungan
Pertama, kita perlu memasang pakej kebergantungan hyperf/jwt dan lcobucci/jwt. Ia boleh dipasang melalui Komposer, buka terminal dan jalankan arahan berikut:
composer require hyperf/jwt lcobucci/jwt
2. Konfigurasikan maklumat pengesahan
Dalam rangka kerja Hyperf, kita perlu mengkonfigurasi maklumat berkaitan yang diperlukan untuk pengesahan JWT. Buka fail config/autoload/jwt.php
dan tambahkan item konfigurasi berikut: 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
rrreee
Mula-mula, kita perlu menjana Token JWT. Perkenalkan kelas HyperfJwtJwt
ke dalam pengawal dan jana Token melalui kaedah make()
. Kod sampel adalah seperti berikut:
rrreee
HyperfJwtMiddlewareJwtMiddleware
ke dalam middleware dan gunakan kaedah handle()
untuk pengesahan dan penghuraian. Kod sampel adalah seperti berikut: 🎜rrreee🎜 4. Gunakan middleware untuk pengesahan 🎜 Gunakan middleware dalam penghalaan untuk pengesahan JWT. Buka fail config/routes.php
dan tambahkan penghalaan dan item konfigurasi middleware berikut: 🎜rrreee🎜Dalam contoh di atas, AppControllerAuthController@info
ialah antara muka yang memerlukan pengesahan. Antara muka ini hanya boleh berjaya diakses apabila membawa Token JWT yang sah. 🎜🎜Kesimpulan: 🎜Artikel ini memperkenalkan cara menggunakan rangka kerja Hyperf untuk pengesahan JWT dan menyediakan contoh konfigurasi dan kod yang berkaitan. Melalui pengesahan JWT, kami boleh mencapai keselamatan yang lebih tinggi dan fungsi pengesahan pengguna dalam rangka kerja Hyperf. Saya harap artikel ini akan membantu anda apabila menggunakan rangka kerja Hyperf untuk pengesahan JWT. 🎜Atas ialah kandungan terperinci Cara menggunakan rangka kerja Hyperf untuk pengesahan JWT. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!