kylesean / hyperf-jwt
A JWT (JSON Web Token) package for Hyperf framework.
v1.0.0
2025-05-25 19:32 UTC
Requires
- php: >=8.1
- lcobucci/clock: ^3.0
- lcobucci/jwt: ^4.0 || ^5.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- hyperf/cache: ^3.0 || ^3.1
- hyperf/command: ^3.1@alpha
- hyperf/contract: ^3.0 || ^3.1
- hyperf/framework: ^3.0 || ^3.1
- hyperf/http-server: ^3.1
- hyperf/support: ^3.1
- mockery/mockery: ^1.6
- phpstan/phpstan: ^1.0
- phpunit/phpunit: ^9.0 || ^10.0
- psr/container: ^1.0 || ^2.0
- psr/simple-cache: ^1.0 || ^2.0 || ^3.0
- swoole/ide-helper: dev-master
- symfony/var-dumper: ^6.0
README
为 Hyperf 框架设计的 JWT (JSON Web Token) 认证包,提供了 Token 签发、解析、验证、刷新、黑名单等功能。
安装
composer require kylesean/hyperf-jwt
配置密钥和算法
php bin/hyperf.php vendor:publish friendsofhyperf/jwt php bin/hyperf.php jwt:gen-key --algo=HS256
其他配置
参考 config/autoload/jwt.php
中的注释,调整以下配置
ttl
:Token 有效期 (分钟)。refresh_ttl
:Token 过期后可刷新的宽限期 (分钟)。blacklist_enabled
:是否启用黑名单。blacklist_cache_driver
:黑名单使用的缓存驱动。token_parsers
:从请求中提取 Token 的解析器链。issuer (iss)
和audience (aud)
声明。required_claims
:验证时必须存在的声明。leeway
:时钟偏差容忍度 (秒)。
签发 Token
$customClaims = [ 'user_id' => 123, 'username' => 'test_user', // 其他自定义数据... ]; $subject = 123; $tokenObject = $this->jwtManager->issueToken($customClaims, $subject); $tokenString = $tokenObject->toString();
解析和验证 Token
use FriendsOfHyperf\Jwt\Contract\ManagerInterface; use FriendsOfHyperf\Jwt\Exception\TokenExpiredException; use FriendsOfHyperf\Jwt\Exception\TokenInvalidException; use FriendsOfHyperf\Jwt\Exception\TokenNotYetValidException; use FriendsOfHyperf\Jwt\Exception\JwtException; use Psr\Http\Message\ServerRequestInterface; // ... try { $tokenObject = $this->jwtManager->parseTokenFromRequest($request); // $tokenObject = $this->jwtManager->parse($tokenString); if ($tokenObject) { $userId = $tokenObject->getClaim('user_id'); $jti = $tokenObject->getId(); // 获取 jti } else { // Token 未找到或无效 } } catch (TokenExpiredException $e) { // Token 已过期 } catch (TokenInvalidException $e) { // Token 无效 (例如,签名错误、声明缺失、已在黑名单) } catch (TokenNotYetValidException $e) { // Token 尚未生效 } catch (JwtException $e) { // 其他 JWT 相关错误 }
刷新 Token
// $oldTokenString 是客户端传递过来的旧 Token 字符串 try { $newTokenObject = $this->jwtManager->refreshToken($oldTokenString); $newTokenString = $newTokenObject->toString(); // 将新的 Token 返回给客户端,客户端需要替换旧的 Token } catch (TokenExpiredException $e) { // 旧 Token 已彻底过期,无法刷新 } catch (TokenInvalidException $e) { // 旧 Token 无效 (例如已在黑名单) } catch (JwtException $e) { // 刷新过程中发生其他错误 } // refreshToken 方法会自动将旧 Token 加入黑名单
使 Token 失效(加入黑名单)
try { $tokenObject = $this->jwtManager->parse($tokenString); if ($tokenObject) { $this->jwtManager->invalidate($tokenObject); // Token 已成功加入黑名单 } } catch (JwtException $e) { }
自定义 PayloadFactory
精细地控制签发 Token 时的默认载荷,或者根据不同场景添加不同的默认声明
// config/dependencies.php return [ \FriendsOfHyperf\Jwt\Contract\PayloadFactoryInterface::class => \App\Service\MyCustomPayloadFactory::class, ];```