public function jwt()
{
$key='!@#$%*&'; //这里是自定义的一个随机字串,应该写在config文件中的,解密时也会用,相当 于加密中常用的 盐 salt
$nowtime = time();
echo ($nowtime+100).'<hr />';
/*
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
*/
$token=array(
"iss"=>$key, //签发者 可以为空
"aud"=>'', //面象的用户 可以为空
"iat"=>$nowtime, //签发时间
"nbf"=>$nowtime+3, //在什么时候jwt开始生效
"jti"=>md5(uniqid('JWT').time()), //该Token唯一标识
"exp"=> $nowtime+100, //token过期时间
"data"=>[ //记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对
'uid'=>3301,
]
);
$jwt = JWT::encode($token, $key, "HS256"); //根据参数生成了 token
echo $jwt;
}
//验证token
function checkToken(){
$token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIhQCMkJSomIiwiYXVkIjoiIiwiaWF0IjoxNjI2NzA2NzgxLCJuYmYiOjE2MjY3MDY3ODQsImp0aSI6ImE0YmE2YTE5NzlkNjcyMDFlOGM1YjQxOWExNjI2ZmUxIiwiZXhwIjoxNjI2NzA2ODgxLCJkYXRhIjp7InVpZCI6MzMwMX19.LZI8WfvNA_tqkE9Nop35Doa-wWw4R_ZQlsiZn50Un7w';
$key='!@#$%*&';
$status=array("code"=>2);
try {
JWT::$leeway = 60;//当前时间减去60,把时间留点余地,避免多服务器时间有误差,设置leeway后,token的有效时间就是exp+leeway
$decoded = JWT::decode($token, $key, array('HS256')); //HS256方式,这里要和签发的时候对应
$arr = (array)$decoded;
$res['code']=1;
$res['data']=$arr['data'];
print_r($res);
} catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
$status['msg']="签名不正确";
print_r($status);
}catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
$status['msg']="token失效";
print_r($status);
}catch(\Firebase\JWT\ExpiredException $e) { // token过期
$status['msg']="token失效";
print_r($status);
}catch(Exception $e) { //其他错误
$status['msg']="未知错误";
print_r($status);
}
}