1. 程式人生 > 實用技巧 >生成和解密token

生成和解密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);
}