jwt、tp中間件聽起來好高大上的樣子。
花了兩天時間閱讀文檔和看視頻,終於懂了點皮毛,在這里記錄一下。
以下兩個問題需要搞懂
1 jwt 是什么 ?
JWT 全稱 Json Web token,是為了在網絡應用環境間傳遞聲明而執行的一種基於json的開放標准(RFC 7519),該token被設計為緊湊且安全的,特別適用於分布式站點的單點登錄(SSO)場景。JWT的聲明一般被用來在身份提供者和服務提供者之間傳遞被認證的用戶身份信息,以便於從服務器獲取資源,也可以增加一些額外的其他業務邏輯所必須的聲明信息,該token也可之間被用於認證,也可以被加密。
簡而言之,我們這里要用到的就是jwt的加密和解密。
先簡單記錄一下
第一步 安裝jwt擴展
建議使用composer安裝 方便 快捷
composer require firebase/php-jwt
運行成功后顯示 圖一 圖二即安裝成功:
圖一:
圖二:
第二步 調用 JWT里面的 encode 和 decode方法進行生成token和驗證token
我是在app 目錄下的 common.php 文件使用的 ,做成了公共方法
首先 引入 JWT ,然后寫兩個方法,生成驗簽和驗證token。
use \Firebase\JWT\JWT;
-
-
//生成驗簽
-
function signToken($uid){
-
$key= '!@#$%*&'; //這里是自定義的一個隨機字串,應該寫在config文件中的,解密時也會用,相當 於加密中常用的 鹽 salt
-
$token= array(
-
"iss"=>$key, //簽發者 可以為空
-
"aud"=>'', //面象的用戶,可以為空
-
"iat"=>time(), //簽發時間
-
"nbf"=>time()+3, //在什么時候jwt開始生效 (這里表示生成100秒后才生效)
-
"exp"=> time()+200, //token 過期時間
-
"data"=>[ //記錄的userid的信息,這里是自已添加上去的,如果有其它信息,可以再添加數組的鍵值對
-
'uid'=>$uid,
-
]
-
);
-
// print_r($token);
-
$jwt = JWT::encode($token, $key, "HS256"); //根據參數生成了 token
-
return $jwt;
-
}
}
-
-
//驗證token
-
function checkToken($token){
-
$key= '!@#$%*&';
-
$status= array("code"=>2);
-
try {
-
JWT::$leeway = 60;//當前時間減去60,把時間留點余地
-
$decoded = JWT::decode($token, $key, array('HS256')); //HS256方式,這里要和簽發的時候對應
-
$arr = ( array)$decoded;
-
$res[ 'code']=1;
-
$res[ 'data']=$arr['data'];
-
return $res;
-
-
} catch(\Firebase\JWT\SignatureInvalidException $e) { //簽名不正確
-
$status[ 'msg']="簽名不正確";
-
return $status;
-
} catch(\Firebase\JWT\BeforeValidException $e) { // 簽名在某個時間點之后才能用
-
$status[ 'msg']="token失效";
-
return $status;
-
} catch(\Firebase\JWT\ExpiredException $e) { // token過期
-
$status[ 'msg']="token失效";
-
return $status;
-
} catch(Exception $e) { //其他錯誤
-
$status[ 'msg']="未知錯誤";
-
return $status;
-
}
-
}
第三步:使用。
生成token ,這里是把用戶id進行加密,當然還可以添加其他參數,比如 ip,手機號,賬戶名等等。把要加密的信息傳給 singToken方法就可以。
-
$user[ 'token'] = signToken($user['id']);
-
-
-
// token 返回值
-
-
//eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJtZGMhQCMkIiwiYXVkIjoiIiwiaWF0IjoxNTc5MTU3OTY4LCJuYmYiOjE1NzkxNTc5NzEsImV4cCI6MTU3OTE1ODE2OCwiZGF0YSI6eyJ1aWQiOjV9fQ.mFdRYr_sf63U5STJoxfOFFRyJj8V4N_h-sx3hQcZ2qk
驗證 token ,這里的token一般用 header 方式傳送,接收后直接調用 直接調用 common.php 文件的 checkToken方法即可。驗證成功返回加密的token信息。驗證失敗返回提示信息。
-
$token = Request::instance()->header( 'token');
-
$res = checkToken($token);