利用PHP-JWT實現token及重新整理token
阿新 • • 發佈:2022-05-10
php-jwt是一個非常好用的token機制,它配合app可實現安全性的使用者鑑權問題,但是token都有一個過期時間,如果過期了,如何讓使用者無感知進行重新整理呢?其實這個主要是在前端進行判斷,如果token過期,後端肯定會給前端返回一個過期提示,同時我們定義一個錯誤碼來標識,如:1002,那前端拿到這個標識進行判斷,如果過期,則去呼叫重新整理介面,具體看下面的程式碼:
首先,通過composer進行安裝:
composer require thans/tp-jwt-auth
然後生成配置檔案:
php think jwt:create
第一次登入請求token:
function get_token() {
$.ajax({
type: "GET",
url: "{:url('index/index/token')}",
dataType: "json",
success: (res) => {
localStorage.setItem('token', res.token)
}
})
}
對應控制器的程式碼:
use thans\jwt\facade\JWTAuth; public function token() { $token = JWTAuth::builder(['userInfo' => ['id' => 1, 'username' => 'jeevin']]); return json(['code' => 200, 'msg' => 'success', 'token' => $token]);; }
然後可以帶上token就可以請求介面的具體資訊了。
function get_user() { let isRefreshing = true;//防止重新請求介面 $.ajax({ type: "GET", url: "{:url('index/index/user')}", data: {token: localStorage.getItem('token')}, dataType: "json", success: (res) => { if(res.code == 1002) { if(isRefreshing){ refreshTokenRequst()//如果過期重新請求介面 } } isRefreshing = false; } }) } function refreshTokenRequst() { $.ajax({ type: "GET", url: "{:url('index/index/refesh_token')}", data: {token: localStorage.getItem('token')}, dataType: "json", success: (res) => { if(res.code == 200) { localStorage.setItem('token', res.token) } } }) }
對應控制器的程式碼:
//使用者資訊
public function user()
{
try{
$token = JWTAuth::auth();
return json(['code' => 200, 'msg' => '成功', 'token' =>$token]);
}catch(\thans\jwt\exception\TokenExpiredException $e){
return json(['code' => 1002, 'msg' => 'token已過期']);
}catch(\Exception $e){
return json(['code' => 400, 'msg' => $e->getMessage()]);
}
}
//重新整理token介面
public function RefeshToken()
{
$token = JWTAuth::refresh();
return json(['code' => 200, 'msg' => '成功', 'token' =>$token]);
}