第一步:引入jwt-auth组件包
composer require phper666/jwt-auth
ps:确保hyperf/cache组件已安装,因为在后面需要用到
第二步:发布配置文件
php bin/hyperf.php jwt:publish --config
执行完毕后,config/autoload文件下会自动生成一个jwt.php的配置文件,这里可以配置关于jwt参数
第三步:编写生成token的业务代码
<?php
namespace App\Controller;
use Hyperf\Redis\RedisFactory;
use Hyperf\Utils\ApplicationContext;
use Phper666\JWTAuth\JWT;
class JwtController extends AbstractController
{
protected $jwt;
public function __construct(JWT $jwt)
{
parent::__construct();
$this->jwt = $jwt;
//将jwt默认的储存驱动改为redis,具体大家可以看下源码
$this->jwt->blackList->cache = ApplicationContext::getContainer()->get(RedisFactory::class)->get('jwt_token');
}
/**
* 登录(生成token)
* @return \Psr\Http\Message\ResponseInterface
* @throws \Psr\SimpleCache\InvalidArgumentException
*/
public function login()
{
//模拟用户信息,实际开发中我们可以使用登录或者注册的相关数据
$userData = [
'uid' => 1001,
'name' => '张三',
'age' => 24
];
$token = $this->jwt->getToken($userData);
return $this->response->json([
'token' => (string) $token,
'exp' => $this->jwt->getTTL() //token有效时长,n秒
])->withStatus(200);
}
/**
* 获取token绑定信息
* @return \Psr\Http\Message\ResponseInterface
*/
public function user()
{
try {
$user = $this->jwt->getParserData();
} catch (\Throwable $exception) {
return $this->response->json([
'message' => $exception->getMessage()
])->withStatus(500);
}
return $this->response->json([
'user' => $user
])->withStatus(200);
}
/**
* 重新登录(刷新token)
* @return \Psr\Http\Message\ResponseInterface
* @throws \Psr\SimpleCache\InvalidArgumentException
*/
public function reLogin()
{
try {
$token = $this->jwt->refreshToken();
} catch (\Throwable $exception) {
return $this->response->json([
'message' => $exception->getMessage()
])->withStatus(500);
}
return $this->response->json([
'token' => $token,
'exp' => $this->jwt->getTTL()
])->withStatus(200);
}
}
第四步:配置验证token中间件
config/routes.php
这个组件依赖包已经提供了一个token验证的中间件(Phper666\JWTAuth\Middleware\JWTAuthMiddleware),也可以参考这个中间件去自定义验证规则
/**
* JWT token
*/
当然你也可以使用hyperf的注解实现
Router::addRoute(['POST'], '/jwt/login', 'App\Controller\JwtController@login');
Router::addRoute(['GET'], '/jwt/user', 'App\Controller\JwtController@user', ['middleware' => [\Phper666\JWTAuth\Middleware\JWTAuthMiddleware::class]]);
Router::addRoute(['GET'], '/jwt/reLogin', 'App\Controller\JwtController@reLogin', ['middleware' => [\Phper666\JWTAuth\Middleware\JWTAuthMiddleware::class]]);
第五步:测试
这里我们选择使用api工具postman进行接口调试。
首先我们先来生成一个token:
接下来我们使用这个token来进行获取绑定信息:
最后我们来测试一下刷新token:
一套完整的jwt的token验证已经完成了,其余的细节我就不一一列举了