PHP使用jwt库 (一般用于api验签,基于TP5)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Drug_/article/details/83995358

PHP交流群:294088839

使用 composer 装jwt 

composer require firebase/php-jwt
引用   use \Firebase\JWT\JWT;

//签发token
    public function signToken($id, $username, $ip){
        $key = "wg.xunshankeji.com" . $ip; //秘钥加密关键 Signature
        $token = array(
            "iss" => "wg.xunshankeji.com", //签发者
            "aud" => $ip, //面向的用户
            "iat" => time(), //签发时间
            "nbf" => time()+3, //在什么时候jwt开始生效
            "exp" => time()+79200, //token 过期时间
            'data'  =>  [ //自定义信息,不要定义敏感信息
                'userid' => $id,
                'username' => $username
            ] //可以用户ID,可以自定义
        );
        $jwt = JWT::encode($token, $key);
        return $jwt;
    }
    //验证token
    public function checkToken($token, $username, $ip){
        $key = "wg.xunshankeji.com" .  $ip;
        try {
            JWT::$leeway = 60;//当前时间减去60,把时间留点余地
            $decoded = JWT::decode($token, $key, array('HS256')); //HS256方式,这里要和签发的时候对应
            $arr = (array)$decoded;
            //获取登录信息
            $userInfo =  Db::name('promoter')->field('id, nickname, token')->where('nickname',$username)->find();
            if($userInfo){
                if($arr['data']->username <> $username || $arr['aud'] <> $ip || $token <> $userInfo['token'] ){
                    return array('status'=>$this->status_code['ERROR_AUTH'], 'msg'=>getMsg('ERROR_AUTH'));
                }
                return array('status'=>$this->status_code['SUCCESS'], 'msg'=>getMsg('SUCCESS'), 'userid'=> $arr['data']->userid, 'username'=> $arr['data']->username);
            } else{
                return array('status'=>$this->status_code['ERROR_AUTH_CHECK_TOKEN_FAIL'], 'msg'=>getMsg('ERROR_AUTH_CHECK_TOKEN_FAIL'));
            }

        } catch(\Firebase\JWT\SignatureInvalidException $e) {  //签名不正确
            return array('status'=>$this->status_code['ERROR_AUTH'], 'msg'=>getMsg('ERROR_AUTH'));
        }catch(\Firebase\JWT\BeforeValidException $e) {  // 签名在某个时间点之后才能用
            return array('status'=>$this->status_code['ERROR_AUTH_CHECK_TOKEN_FAIL'], 'msg'=>getMsg('ERROR_AUTH_CHECK_TOKEN_FAIL'));
        }catch(\Firebase\JWT\ExpiredException $e) {  // token过期
            return array('status'=>$this->status_code['ERROR_AUTH_CHECK_TOKEN_TIMEOUT'], 'msg'=>getMsg('ERROR_AUTH_CHECK_TOKEN_TIMEOUT'));
        }catch(Exception $e) {  //其他错误
            return array('status'=>$this->status_code['ERROR_AUTH_TOKEN'], 'msg'=>getMsg('ERROR_AUTH_TOKEN'));
        }
    }

猜你喜欢

转载自blog.csdn.net/Drug_/article/details/83995358
今日推荐