1. 程式人生 > >PHP使用jwt庫 (一般用於api驗籤,基於TP5)

PHP使用jwt庫 (一般用於api驗籤,基於TP5)

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'));
        }
    }