一:首先要安装Tp6的框架
composer create-project topthink/think tp
二:确定安装的JWT扩展
这里这个是官方下载量最高的一个扩展命令
composer require firebase/php-jwt
三:这是生成Token所需要的方法
<?php
namespace app\admin\server;
use Firebase\JWT\JWT;
class Token
{
protected $salt;
public function __construct()
{
//从配置信息这种或取唯一字符串,你可以随便写比如md5('token')
$this->salt = config('jwt.salt');
}
/**
* 生成token
* @param $uid
* @return mixed
*/
function generateToken($uid)
{
//获取当前时间戳
$currentTime = time();
$data = array(
"iss" => 'keZuo', //签发者 可以为空
"aud" => '', //面象的用户,可以为空
"iat" => $currentTime, //签发时间
"nbf" => $currentTime, //立马生效
"exp" => $currentTime + 7200, //token 过期时间 两小时
"data" => [ //记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对
'uid' => $uid,
]
);
//生成token
$token = JWT::encode($data, $this->salt, "HS256"); //根据参数生成了 token
return $token;
}
/**
* 校验token时效性
*/
public function chekToken($token)
{
$status=array("code"=>2);
try {
JWT::$leeway = 60;//当前时间减去60,把时间留点余地
$decoded = JWT::decode($token, $this->salt, array('HS256')); //HS256方式,这里要和签发的时候对应
$arr = (array)$decoded;
$res['code']=1;
$res['data']=$arr['data'];
return $res;
} catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
$status['msg']="签名不正确";
return $status;
}catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
$status['msg']="token失效";
return $status;
}catch(\Firebase\JWT\ExpiredException $e) { // token过期
$status['msg']="token失效";
return $status;
}catch(\Exception $e) { //其他错误
$status['msg']="未知错误";
return $status;
}
}
}
四:最后就是生成Token和使用中间件解析Token
//生成token,保存用户登录状态
$token = (new TokenServer())->generateToken($user->id);
中间件代码
/**
* 处理请求
*
* @param \think\Request $request
* @param \Closure $next
* @return Response
*/
public function handle($request, \Closure $next)
{
//第一步先取token
$token = $request->header('token');
//jwt进行校验token
$res = (new TokenServer())->chekToken($token);
if ($res['code'] != 1 ){
return json(['error_code'=>999,'msg'=>$res['msg'],'data'=>''],400);
}
$request->uid = $res['data']->uid;
return $next($request);
}