• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。

    希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • PHP token验证生成原理实例分析
    • thinkphp5框架API token身份验证功能示例
    • ThinkPHP5.1表单令牌Token失效问题的解决
    • php获取微信基础接口凭证Access_token
    • PHP实现防止表单重复提交功能【基于token验证】
    • PHP中token的生成案例
    上一篇:Laravel 对某一列进行筛选然后求和sum()的例子
    下一篇:laravel 使用auth编写登录的方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    thinkphp框架使用JWTtoken的方法详解 thinkphp,框架,使用,JWTtoken,