thinkphp使用说明(thinkphp框架使用JWTtoken的方法详解)
类别:编程学习 浏览量:309
时间:2021-10-15 00:53:32 thinkphp使用说明
thinkphp框架使用JWTtoken的方法详解本文实例讲述了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框架的PHP程序设计有所帮助。
原文链接:https://blog.csdn.net/flysnownet/article/details/90260826
您可能感兴趣
- php集成支付(ThinkPHP框架整合微信支付之刷卡模式图文详解)
- thinkphp怎么整合微信支付(ThinkPHP框架实现的微信支付接口开发完整示例)
- thinkphp5数据库配置(Thinkphp5框架实现获取数据库数据到视图的方法)
- thinkphp微信开发实例(ThinkPHP框架下微信支付功能总结踩坑笔记)
- vuephp后台开发框架(Vue+thinkphp5.1+axios实现文件上传)
- think php上传服务器(ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例)
- thinkphp表单提交不到数据(ThinkPHP5.1表单令牌Token失效问题的解决)
- thinkphp继承model如何使用(Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解)
- thinkphp5配置入口路径(ThinkPHP5.1框架数据库链接和增删改查操作示例)
- ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解(ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解)
- thinkphp框架多文件上传完整代码(Thinkphp5 自定义上传文件名的实现方法)
- thinkphp6.0安装(使用composer安装使用thinkphp6.0框架问题视频教程)
- thinkphp5怎么设置当前的模块(thinkPHP5.1框架中Request类四种调用方式示例)
- thinkphp使用说明(thinkphp框架使用JWTtoken的方法详解)
- thinkphp5对接支付宝扫码支付(ThinkPHP框架下整合支付宝支付功能图文教程)
- thinkphp5 api开发(thinkphp5框架前后端分离项目实现分页功能的方法分析)
- 2023新国风戏曲教育寒假集训班汇报演出《戏娃闹元宵》图文报道(2023新国风戏曲教育寒假集训班汇报演出戏娃闹元宵图文报道)
- 九儿《狐踪谍影》出演热血女特警,戏份杀青受关注(九儿狐踪谍影出演热血女特警)
- 红色代表什么(红色代表什么寓意)
- 蓝天代表什么(蓝天代表什么生肖)
- 今天要吃什么(今天要吃什么菜)
- 营养餐是什么(学校营养餐是什么)
热门推荐
- laravel 前后端开发(在Laravel中实现使用AJAX动态刷新部分页面)
- laravel开发api支持多少并发(laravel框架 api自定义全局异常处理方法)
- html5开发图片(HTML5开发动态音频图的实现)
- nginxlocation匹配参数(nginx location优先级的深入讲解)
- vuecli项目入门(vue-cli4.5.x快速搭建项目)
- sqlserver怎么写判断条件(SQL Server之SELECT INTO 和 INSERT INTO SELECT案例详解)
- nginx proxypass配置(nginx location中多个if里面proxy_pass的方法)
- 织梦cms中的模块怎么设置(织梦CMS模板在runphp=yes的标签中调用其他field值的方法)
- python入门练习网页(详解python项目实战:模拟登陆CSDN)
- php代码打包环境加密(php实现对文件压缩简单的方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9