侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

thinkphp框架使用JWTtoken的方法详解

ThinkPHP  /  管理员 发布于 8年前   236

本文实例讲述了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程序设计有所帮助。

您可能感兴趣的文章:

  • ThinkPHP 5.1 跨域配置方法


  • 上一条:
    thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
    下一条:
    thinkphp5框架前后端分离项目实现分页功能的方法分析
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • thinkphp + mongodb项目中数据加载慢问题分析及解决(0个评论)
    • thinkphp6框架中封装redis操作类(0个评论)
    • thinkphp6框架中实现定时任务功能流程步骤(0个评论)
    • Thinkphp5.1框架中实现Session+Redis会话共享流程步骤(0个评论)
    • TP5框架版本5.0.10安全漏洞根据官方补丁修复,也是本站安全漏洞修复(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-12
    • 2018-01
    • 2018-02
    • 2020-03
    • 2021-07
    • 2021-12
    • 2022-05
    • 2022-06
    • 2022-09
    • 2023-01
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客