1. 程式人生 > 其它 >利用PHP-JWT實現token及重新整理token

利用PHP-JWT實現token及重新整理token

php-jwt是一個非常好用的token機制,它配合app可實現安全性的使用者鑑權問題,但是token都有一個過期時間,如果過期了,如何讓使用者無感知進行重新整理呢?其實這個主要是在前端進行判斷,如果token過期,後端肯定會給前端返回一個過期提示,同時我們定義一個錯誤碼來標識,如:1002,那前端拿到這個標識進行判斷,如果過期,則去呼叫重新整理介面,具體看下面的程式碼:

ThinkPHP框架中使用jwt技術來實現Token令牌

首先,通過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]);
}