导航

利用PHP-JWT实现token及刷新token

Posted on 2022-05-10 14:37  eastson  阅读(1960)  评论(0编辑  收藏  举报

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