您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
thinkphp6中jwt的使用
发布时间:2021-10-17 11:31:01编辑:雪饮阅读()
jwt 是什么 ?
JWT 全称 Json Web token
建议使用composer安装 方便 快捷
composer require firebase/php-jwt
那么jwt一般用呢就用在像是在登录成功签发token、注册成功签发token、注销登录删除token、其它业务有需要token授权的则携带该token如header中。
那么jwt的token生成则可以像是这样:
public function createJwtToken($data){
$nowtime = time();
$token = [
'iss' => 'http://www.helloweba.net', //签发者
'aud' => 'http://www.helloweba.net', //jwt所面向的用户
'iat' => $nowtime, //签发时间
'nbf' => $nowtime + 10, //在什么时间之后该jwt才可用
'exp' => $nowtime + 600, //过期时间-10min
'data' => $data
];
$jwt = JWT::encode($token, Config("jwt.key"));
return $jwt;
}
$nowtime = time();
$token = [
'iss' => 'http://www.helloweba.net', //签发者
'aud' => 'http://www.helloweba.net', //jwt所面向的用户
'iat' => $nowtime, //签发时间
'nbf' => $nowtime + 10, //在什么时间之后该jwt才可用
'exp' => $nowtime + 600, //过期时间-10min
'data' => $data
];
$jwt = JWT::encode($token, Config("jwt.key"));
return $jwt;
}
这里关于时间之类的其实我觉得一般用不上,这里有用到一个key,这个key就是服务端用来加密和解密的key,可以自定义,一般放到服务端的配置文件中即可。
而对于解密来说可以像是这样:
public function handle($request, \Closure $next)
{
$jwt = isset($_SERVER['HTTP_TOKEN']) ? $_SERVER['HTTP_TOKEN'] : '';
if (empty($jwt)) {
$res['msg'] = 'You do not have permission to access.';
return json($res);
}
try {
JWT::$leeway = 60;
$decoded = JWT::decode($jwt, Config("jwt.key"), ['HS256']);
$arr = (array)$decoded;
$request->userInfo=$arr;
} catch(\Exception $e) {
$res['msg'] = $e->getMessage();
return json($res);
}
return $next($request);
}
{
$jwt = isset($_SERVER['HTTP_TOKEN']) ? $_SERVER['HTTP_TOKEN'] : '';
if (empty($jwt)) {
$res['msg'] = 'You do not have permission to access.';
return json($res);
}
try {
JWT::$leeway = 60;
$decoded = JWT::decode($jwt, Config("jwt.key"), ['HS256']);
$arr = (array)$decoded;
$request->userInfo=$arr;
} catch(\Exception $e) {
$res['msg'] = $e->getMessage();
return json($res);
}
return $next($request);
}
这里有一个leeway属性,该属性与签发token时候的时间有关,就是说服务器端与客户端的时间可能有误差,而这个leeway属性就相当于配置一个误差的时间容错值,一个误差的允许精度。
jwt的授权流程是服务端给客户端签发token,之后有需要token的业务则需要前端携带该token进行请求,服务端去解密验证该token。
而这里的JWT::decode在进行解密过程中若能成功解密则token有效,若抛出了异常则是token无效或者token的时间之类的不符合签发时候的时效性。总之也就是无效的意思了。
那么就我这边的理解,如果不考虑注销登录这种情况,以上这些基本就可以满足了常见的业务的。
但是像是之前用session这种形式实现注销登录,则服务端干掉session即可。
对于jwt这种,token给了前端,那么注销登录可以通过前端来干掉token,不过这种方式并不是最好的。
有人说是可以在签发token时候多加一个类似有效性的字段,然后服务端存储下对应用户的token然后再发给客户端,下次客户端来请求时候,首先要通过标注jwt的解密校验,其次就是通过该有效性字段的校验,由于token是放在服务端也有一份,所以服务端也是可以修改这个有效性字段的值的。
不过就我来看,这样其实有点麻烦,上面我们签发的时候可以看到我们把业务数据放在data中,按他的意思则可以data中再建立一个类似有效性的字段或者data同级建立一个类似有效性的字段,到时候由于jwt的token是由点分形式三部分字符串组成的。(具体jwt的概念知识可以参考https://www.jianshu.com/p/576dbf44b2ae)
那么所以我觉得像是注销登录这样,是可以服务端存储一份token,然后注销的时候就删除该用户对应的token即可。
关键字词:thinkphp6,jwt