利用PHP-JWT实现token及刷新token
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]);
}