JWTtoken怎么在thinkphp框架中使用
JWTtoken怎么在thinkphp框架中使用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
一:JWT介绍:全称JSON Web Token,基于JSON的开放标准((RFC 7519) ,以token的方式代替传统的Cookie-Session模式,用于各服务器、客户端传递信息签名验证。
二:JWT优点:
1:服务端不需要保存传统会话信息,没有跨域传输问题,减小服务器开销。
2:jwt构成简单,占用很少的字节,便于传输。
3:json格式通用,不同语言之间都可以使用。
三:JWT组成
1:jwt由三部分组成:
头部(header) 载荷(payload) 包含一些定义信息和自定义信息 签证(signature)
2:具体构成:
header:
{ "typ":"JWT",//声明类型为jwt "alg":"HS256"//声明签名算法为SHA256 }
载荷(payload)
{ "iss":"http://www.helloweba.net", "aud":"http://www.helloweba.net", "iat":1525317601, "nbf":1525318201, "exp":1525318201, "data":{ "userid":1, "username":"李小龙" } }
载荷包括两部分:标准声明和其他声明。
标准声明:JWT标准规定的声明,但不是必须填写的;
标准声明字段:
接收该JWT的一方
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,过期时间必须要大于签发时间
nbf: 定义在什么时间之前,某个时间点后才能访问
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token。
下载
composerrequirefirebase/php-jwt
extend 下创建token类
namespaceToken; usethink\Controller; usethink\facade\Request; useFirebase\JWT\JWT; /**token类 *ClassToken *@packageapp\api\Controller */ classToken { /** *创建token *@paramarray$data必填自定义参数数组 *@paraminteger$exp_time必填token过期时间单位:秒例子:7200=2小时 *@paramstring$scopes选填token标识,请求接口的token *@returnstring */ private$TokenKey="123456"; publicfunctioncreateToken($data="",$exp_time=0,$scopes=""){ //JWT标准规定的声明,但不是必须填写的; //iss:jwt签发者 //sub:jwt所面向的用户 //aud:接收jwt的一方 //exp:jwt的过期时间,过期时间必须要大于签发时间 //nbf:定义在什么时间之前,某个时间点后才能访问 //iat:jwt的签发时间 //jti:jwt的唯一身份标识,主要用来作为一次性token。 //公用信息 try{ $key=$this->TokenKey; $time=time();//当前时间 //$token['iss']='';//签发者可选 //$token['aud']='';//接收该JWT的一方,可选 $token['iat']=$time;//签发时间 $token['nbf']=$time;//(NotBefore):某个时间点后才能访问,比如设置time+30,表示当前时间30秒后才能使用 if($scopes){ $token['scopes']=$scopes;//token标识,请求接口的token } if(!$exp_time){ $exp_time=7200;//默认=2小时过期 } $token['exp']=$time+$exp_time;//token过期时间,这里设置2个小时 if($data){ $token['data']=$data;//自定义参数 } $json=JWT::encode($token,$key); $returndata['status']="200";// $returndata['msg']='success'; $returndata['token']=$json;//返回的数据 return$returndata;//返回信息 }catch(\Firebase\JWT\ExpiredException$e){//签名不正确 $returndata['status']="104";//101=签名不正确 $returndata['msg']=$e->getMessage(); $returndata['data']="";//返回的数据 return$returndata;//返回信息 }catch(\Exception$e){//其他错误 $returndata['status']="199";//199=签名不正确 $returndata['msg']=$e->getMessage(); $returndata['data']="";//返回的数据 return$returndata;//返回信息 } } /** *验证token是否有效,默认验证exp,nbf,iat时间 *@paramstring$jwt需要验证的token *@returnstring$msg返回消息 */ publicfunctioncheckToken($jwt){ $key=$this->TokenKey; try{ JWT::$leeway=60;//当前时间减去60,把时间留点余地 $decoded=JWT::decode($jwt,$key,['HS256']);//HS256方式,这里要和签发的时候对应 $arr=(array)$decoded; $returndata['status']="200";//200=成功 $returndata['msg']="success";// $returndata['data']=$arr;//返回的数据 return$returndata;//返回信息 }catch(\Firebase\JWT\SignatureInvalidException$e){//签名不正确 $returndata['status']="101";//101=签名不正确 $returndata['msg']=$e->getMessage(); $returndata['data']="";//返回的数据 //returnjson_encode($returndata);//返回信息 //exit(json_encode($returndata)); sendResponse($returndata,401,'Unauthorized'); }catch(\Firebase\JWT\BeforeValidException$e){//签名在某个时间点之后才能用 $returndata['status']="102"; $returndata['msg']=$e->getMessage(); $returndata['data']="";//返回的数据 sendResponse($returndata,401,'Unauthorized'); }catch(\Firebase\JWT\ExpiredException$e){//token过期 $returndata['status']="103";//103=签名不正确 $returndata['msg']=$e->getMessage(); $returndata['data']="";//返回的数据 sendResponse($returndata,401,'Unauthorized'); }catch(\Exception$e){//其他错误 $returndata['status']="199";//199=签名不正确 $returndata['msg']=$e->getMessage(); $returndata['data']="";//返回的数据 sendResponse($returndata,401,'Unauthorized'); } //Firebase定义了多个thrownew,我们可以捕获多个catch来定义问题,catch加入自己的业务,比如token过期可以用当前Token刷新一个新Token }
签发
$jwtToken=newToken(); $tokenData=array( 'openid'=>$user->getId(), 'uniacid'=>$_W['uniacid'], ); $token=$jwtToken->createToken($tokenData)
验证
if(empty($_SERVER['HTTP_AUTHORIZATION'])) { $res['status']="201"; $res['msg']="notoken"; $res['data']="";//返回的数据 sendResponse($res,401,'Unauthorized'); } $token=$_SERVER['HTTP_AUTHORIZATION']; $jwtToken=newToken(); $checkToken=$jwtToken->checkToken($token); $data=(array)$checkToken['data']['data'];
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注恰卡编程网行业资讯频道,感谢您对恰卡编程网的支持。
推荐阅读
-
如何快速解决ThinkPHP5.1出现MISS缓存未命中问题
如何快速解决ThinkPHP5.1出现MISS缓存未命中问题这篇文...
-
thinkphp 6.0 swoole扩展websocket使用教程
-
PHP之ThinkPHP框架,让你10分钟快速入门,还免费包教会哟
-
ThinkPHP5.0目录结构,作用及其初略说明
-
Thinkphp在IIS7.5里的伪静态代码,亲测,收藏
-
哪些PHP开源作品值得关注
-
开源学校教务管理系统
-
一次项目中Thinkphp绕过禁用函数的实战记录
-
thinkphp如何用中间件记录行为日志
-
thinkphp3.1与3.2的区别有哪些
thinkphp3.1与3.2的区别有哪些今天小编给大家分享一下t...