多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
1.安装jwt: ~~~ Lcobucci\\JWT暂不能使用,故先使用firebase/php-jwt composer require firebase/php-jwt ~~~ 2.小知识 (1)api服务器的时间与业务系统所在的机器时间有些小偏差 第一种:把两个服务器的时间同步成一致的 第二种:查看php-jwt的源码提供了一个静态变量$leeway,我们可以在解签前JWT::$leeway+=15;解决问题 3.建立类库 ~~~ <?php /** * Created by PhpStorm. * User: Administrator * Date: 2020/12/28 * Time: 16:58 */ namespace lib; use Firebase\JWT\JWT; class Jwt2{ public function access_token(){ $access= config('jwt.access'); $key=config('jwt.jti'); $token=JWT::encode($access,$key); return $token; } public function refresh_token(){ $access= config('jwt.refresh'); $key=config('jwt.jti'); $token=JWT::encode($access,$key); return $token; } public function verily_token($token,$type='role_access'){ $key=config('jwt.jti');//key要和签发的时候一样 try { // JWT::$leeway = 60;//当前时间减去60,把时间留点余地 $decoded = JWT::decode($token, $key, ['HS256']); //HS256方式,这里要和签发的时候对应 $arr = (array)$decoded; if($arr['scopes']!==$type){ return 'token类型错误'; } return true; } catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确 return $e->getMessage(); }catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用 return $e->getMessage(); }catch(\Firebase\JWT\ExpiredException $e) { // token过期 return $e->getMessage(); }catch(Exception $e) { //其他错误 return $e->getMessage(); } } } ~~~ 4.调用 ~~~ public function get_token(){ $jwt=new Jwt2(); $token['access_token']=$jwt->access_token(); $token['refresh_token']=$jwt->refresh_token(); Header("HTTP/1.1 201 Created"); return json($token); } public function check_token(){ $token=input('token'); $jwt=new Jwt2(); $check=$jwt->verily_token($token); var_dump($check); } public function new_token(){ $token=input('token'); $jwt=new Jwt2(); $check=$jwt->verily_token($token,'refresh_access'); if($check){ $jwt=new Jwt2(); $access_token=$jwt->access_token(); return $access_token; }else{ return $check; } } ~~~ 5.配置文件 ~~~ <?php /** * Created by PhpStorm. * User: Administrator * Date: 2020/12/29 * Time: 10:54 */ return [ "access"=>[ "iss"=>"http://tp6.xian666.cn", //jwt签发者 "aud"=>"http://tp6.xian666.cn", //接收jwt的一方 "exp"=>time()+3600*2,// jwt的过期时间,过期时间必须要大于签发时间 "iat"=>time(),// jwt的签发时间 "nbf"=>time(),// 定义在什么时间之前,某个时间点后才能访问 "scopes"=>"role_access"//token标识,请求接口的token //"sub"=>'', jwt所面向的用户 ], "refresh"=>[ "iss"=>"http://tp6.xian666.cn", //jwt签发者 "aud"=>"http://tp6.xian666.cn", //接收jwt的一方 "exp"=>time()+3600*24*7,// jwt的过期时间,过期时间必须要大于签发时间 "iat"=>time(),// jwt的签发时间 "nbf"=>time()+3600,// 定义在什么时间之前,某个时间点后才能访问 "scopes"=>"refresh_access"//token标识,请求接口的token //"sub"=>'', jwt所面向的用户 ], "jti"=>"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9",// jwt的唯一身份标识,主要用来作为一次性token。 ]; ~~~