生成Token
/*** 创建 token* @param array $data 必填 自定义参数数组* @param integer $exp_time 必填 token过期时间 单位:秒 例子:7200=2小时* @param string $scopes 选填 token标识,请求接口的token* @return string*/public function createToken($data = \"\", $exp_time = 0, $scopes = \"\"){//JWT标准规定的声明,但不是必须填写的;//iss: jwt签发者//sub: jwt所面向的用户//aud: 接收jwt的一方//exp: jwt的过期时间,过期时间必须要大于签发时间//nbf: 定义在什么时间之前,某个时间点后才能访问//iat: jwt的签发时间//jti: jwt的唯一身份标识,主要用来作为一次性token。//公用信息try {$key = \'TokenKey\';$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 = 7200;//默认=2小时过期}$token[\'exp\'] = $time + $exp_time; //token过期时间,这里设置2个小时if ($data) {$token[\'data\'] = $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 返回消息*/public function checkToken($jwt){$key = \'TokenKey\';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); //返回信息} 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$token = Request::header(\'token\');//接受返回的结果$checkToken = action(\'checkToken\', [\'jwt\' => $token]);
解密token
function check(){
$jwt = input(“token”); //上一步中返回给用户的token
$key = “huang”; //上一个方法中的 $key 本应该配置在 config文件中的
info=JWT::decode(info = JWT::decode(info=JWT::decode(jwt,$key,[“HS256”]); //解密jwt
return $info;
}