PHP开发api时封装jwt

下载 composer require firebase/php-jwt
链接 https://packagist.org/packages/firebase/php-jwt

封装jwt

	/**
     * 创建 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 = '';
            $time = time(); //当前时间
            $token['iss'] = ''; //签发者 可选
            $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是否有效,默认验证exp,nbf,iat时间
     * @param string $jwt 需要验证的token
     * @return string $msg 返回消息
     */
    function checkToken($jwt)
    {
    
    
        $key = '';
        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
    function check($token){
    
    
        vendor('firebase.php-jwt.src.JWT');
        $JWT = new \Firebase\JWT\JWT();
        $jwt = $token;
        // $jwt = input("token");  //上一步中返回给用户的token
        $key = "";  //上一个方法中的 $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);
    }

猜你喜欢

转载自blog.csdn.net/weixin_45557228/article/details/115006715
今日推荐