生成和解密token


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM