composer 安装JWT
composer require firebase/php-jwt
首先在应用公共文件中引入JWT
use Firebase\JWT\JWT;
创建token
/** * 创建 token * @param array $data 必填 自定义参数数组 * @param integer $exp_time 必填 token过期时间 单位:秒 例子:7200=2小时 * @param string $scopes 选填 token标识,请求接口的token * @return string */ function createToken($data = "", $exp_time = 0, $scopes = "") { //JWT标准规定的声明,但不是必须填写的; //iss: jwt签发者 //sub: jwt所面向的用户 //aud: 接收jwt的一方 //exp: jwt的过期时间,过期时间必须要大于签发时间 //nbf: 定义在什么时间之前,某个时间点后才能访问 //iat: jwt的签发时间 //jti: jwt的唯一身份标识,主要用来作为一次性token。 //公用信息 try { $key = \'huang\'; $time = time(); //当前时间 $token[\'iss\'] = \'Jouzeyu\'; //签发者 可选 $token[\'aud\'] = \'\'; //接收该JWT的一方,可选 $token[\'iat\'] = $time; //签发时间 $token[\'nbf\'] = $time+3; //(Not Before):某个时间点后才能访问,比如设置time+30,表示当前时间30秒后才能使用 if ($scopes) { $token[\'scopes\'] = $scopes; //token标识,请求接口的token } if (!$exp_time) { $exp_time = 5;//默认=2小时过期 } $token[\'exp\'] = $time + $exp_time; //token过期时间,这里设置2个小时 if ($data) { $token[\'uid\'] = $data; //自定义参数 } $json = JWT::encode($token, $key); //Header("HTTP/1.1 201 Created"); //return json_encode($json); //返回给客户端token信息 return $json; //返回给客户端token信息 } catch (\Firebase\JWT\ExpiredException $e) { //签名不正确 $returndata[\'code\'] = "104";//101=签名不正确 $returndata[\'msg\'] = $e->getMessage(); $returndata[\'data\'] = "";//返回的数据 return json_encode($returndata); //返回信息 } catch (Exception $e) { //其他错误 $returndata[\'code\'] = "199";//199=签名不正确 $returndata[\'msg\'] = $e->getMessage(); $returndata[\'data\'] = "";//返回的数据 return json_encode($returndata); //返回信息 } }
验证token是否有效
/** * 验证token是否有效,默认验证exp,nbf,iat时间 * @param string $jwt 需要验证的token * @return string $msg 返回消息 */ function checkToken($jwt) { $key = \'huang\'; try { JWT::$leeway = 60;//当前时间减去60,把时间留点余地 $decoded = JWT::decode($jwt, $key, [\'HS256\']); //HS256方式,这里要和签发的时候对应 $arr = (array)$decoded; $returndata[\'code\'] = "200";//200=成功 $returndata[\'msg\'] = "成功";// $returndata[\'data\'] = $arr;//返回的数据 return json_encode($returndata,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT); //返回信息 } catch (\Firebase\JWT\SignatureInvalidException $e) { //签名不正确 //echo "2,"; //echo $e->getMessage(); $returndata[\'code\'] = "101";//101=签名不正确 $returndata[\'msg\'] = $e->getMessage(); $returndata[\'data\'] = "";//返回的数据 return json_encode($returndata); //返回信息 } catch (\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用 //echo "3,"; //echo $e->getMessage(); $returndata[\'code\'] = "102";//102=签名不正确 $returndata[\'msg\'] = $e->getMessage(); $returndata[\'data\'] = "";//返回的数据 return json_encode($returndata); //返回信息 } catch (\Firebase\JWT\ExpiredException $e) { // token过期 //echo "4,"; //echo $e->getMessage(); $returndata[\'code\'] = "103";//103=签名不正确 $returndata[\'msg\'] = $e->getMessage(); $returndata[\'data\'] = "";//返回的数据 return json_encode($returndata); //返回信息 } catch (Exception $e) { //其他错误 //echo "5,"; //echo $e->getMessage(); $returndata[\'code\'] = "199";//199=签名不正确 $returndata[\'msg\'] = $e->getMessage(); $returndata[\'data\'] = "";//返回的数据 return json_encode($returndata); //返回信息 } //Firebase定义了多个 throw new,我们可以捕获多个catch来定义问题,catch加入自己的业务,比如token过期可以用当前Token刷新一个新Token }
解密token
// 解密token function check($token){ vendor(\'firebase.php-jwt.src.JWT\'); $JWT=new \Firebase\JWT\JWT(); $jwt = $token; // $jwt = input("token"); //上一步中返回给用户的token $key = "huang"; //上一个方法中的 $key 本应该配置在 config文件中的 $info = $JWT->decode($jwt,$key,["HS256"]); //解密jwt return $info; }
成功返回
// 成功返回 function json_success($code,$msg,$arr=[]){ return json_encode([\'code\'=>$code,\'status_code\'=>\'success\',\'msg\'=>$msg,\'datas\'=>$arr],JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT); }
失败返回
// 失败返回 function json_error($code,$msg,$arr=[]){ return json_encode([\'code\'=>$code,\'status_code\'=>\'error\',\'msg\'=>$msg,\'datas\'=>$arr],JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT); }