本文实例讲述了thinkphp框架使用JWTtoken的方法。分享给大家供大家参考,具体如下:
简介
一: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。
下载
composer require firebase/php-jwt
extend 下创建token类
namespace Token; use think\Controller; use think\facade\Request; use Firebase\JWT\JWT; /**token类 * Class Token * @package app\api\Controller */ class Token { /** * 创建 token * @param array $data 必填 自定义参数数组 * @param integer $exp_time 必填 token过期时间 单位:秒 例子:7200=2小时 * @param string $scopes 选填 token标识,请求接口的token * @return string */ private $TokenKey = "123456"; public function createToken($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; //(Not Before):某个时间点后才能访问,比如设置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时间 * @param string $jwt 需要验证的token * @return string $msg 返回消息 */ public function checkToken($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']="";//返回的数据 //return json_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定义了多个 throw new,我们可以捕获多个catch来定义问题,catch加入自己的业务,比如token过期可以用当前Token刷新一个新Token }
签发
$jwtToken = new Token(); $tokenData = array( 'openid' => $user->getId(), 'uniacid' => $_W['uniacid'], ); $token = $jwtToken->createToken($tokenData)
验证
if (empty($_SERVER['HTTP_AUTHORIZATION'])) { $res['status']="201"; $res['msg']="no token"; $res['data']="";//返回的数据 sendResponse($res,401,'Unauthorized'); } $token = $_SERVER['HTTP_AUTHORIZATION']; $jwtToken = new Token(); $checkToken = $jwtToken->checkToken($token); $data = (array)$checkToken['data']['data'];
更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】