当前位置:首页 > CMS教程 > Thinkphp > 列表

ThinkPHP5框架中使用JWT的方法示例

发布:smiling 来源: PHP粉丝网  添加日期:2022-03-12 13:32:40 浏览: 评论:0 

本文实例讲述了ThinkPHP5框架中使用JWT的方法,分享给大家供大家参考,具体如下:

JWT下载地址:https://jwt.io

可以直接去github上下载,也可以使用composer

使用composer的话要确保你的电脑上安装了composer,进入项目根目录下载即了,自动会放在vendor目录下

创建文件

我是放在common目录下

ThinkPHP5框架中使用JWT的方法示例

使用教程

github都有的

贴源码

JWTAuth.php

  1. <?php 
  2. namespace app\common\Auth; 
  3. use \Lcobucci\JWT\Builder; 
  4. use \Lcobucci\JWT\Signer\Hmac\Sha256; 
  5. use \Lcobucci\JWT\Parser; 
  6. use \Lcobucci\JWT\ValidationData; 
  7. /** 
  8.  * 单例模式 
  9.  */ 
  10. class JWTAuth 
  11. { 
  12.     private static $instance; 
  13.     /** 
  14.      * JWT TOKEN 
  15.      * @var [type] 
  16.      */ 
  17.     private $token; 
  18.     /** 
  19.      * 颁发 
  20.      * @var string 
  21.      */ 
  22.     private $iss = 'api.test.com'; 
  23.     /** 
  24.      * 接收 
  25.      * @var string 
  26.      */ 
  27.     private $aud = 'app.com'; 
  28.    
  29.     private $uid; 
  30.    
  31.     private $secrect="#$%#$%*&^(*(*("; 
  32.    
  33.     private $decodeToken; 
  34.    
  35.     public static function getInstance() { 
  36.         if(is_null(self::$instance)) { 
  37.             self::$instance = new self(); 
  38.         } 
  39.         return self::$instance; 
  40.     } 
  41.    
  42.     private function __contruct(){ 
  43.    
  44.     } 
  45.    
  46.     private function __clone(){ 
  47.    
  48.     } 
  49.    
  50.     public function encode(){ 
  51.         $time = time(); 
  52.         $this->token = (new builder())->setHeader('alg','HS256') 
  53.             ->setIssuer($this->iss) 
  54.             ->setAudience($this->aud) 
  55.             ->setIssuedAt($time) //生效时间 
  56.             ->setExpiration($time + 20)//过期时间 
  57.             ->set('uid',$this->uid) 
  58.             ->sign(new Sha256(), $this->secrect)//加密算法 
  59.             ->getToken(); 
  60.    
  61.             return $this; 
  62.     } 
  63.    
  64.     public function getToken(){ 
  65.         return (string)$this->token; 
  66.     } 
  67.    
  68.     public function setToken($token){ 
  69.         $this->token = $token; 
  70.         return $this; 
  71.     } 
  72.     /** 
  73.      * 用户信息uid 
  74.      * @param [type] $uid [description] 
  75.      */ 
  76.     public function setUid($uid){ 
  77.         $this->uid = $uid; 
  78.         return $this; 
  79.     } 
  80.    
  81.     public function jsonDecode(){ 
  82.    
  83.         $token = $this->token; 
  84.         $this->decodeToken = (new Parser())->parse((string) $token);  
  85.    
  86.         // echo $this->decodeToken->getClaim('uid'); 
  87.         return $this->decodeToken; 
  88.     } 
  89.     /** 
  90.      * 验证令牌是否有效 
  91.      * @return [type] [description] 
  92.      */ 
  93.     public function validate(){ 
  94.    
  95.         $data = new ValidationData(); 
  96.         $data->setIssuer($this->iss); 
  97.         $data->setAudience($this->aud); 
  98.         return $this->jsonDecode()->validate($data); 
  99.    
  100.     } 
  101.     /** 
  102.      * 签名来验证令牌在生成后是否未被修改 
  103.      * @return [type] [description] 
  104.      */ 
  105.     public function verify(){ 
  106.         $result = $this->jsonDecode()->verify(new Sha256(), $this->secrect); 
  107.         return $result; 
  108.     } 
  109.    
  110. } 

user.php 用来测试

  1. <?php 
  2. namespace app\index\controller; 
  3. use app\common\Auth\JWTAuth; 
  4.    
  5. class User{ 
  6.    
  7.     public function login(){ 
  8.           
  9.         $jwtAuth = JWTAuth::getInstance(); 
  10.         $token = $jwtAuth->setUid(1)->encode()->getToken(); 
  11.         echo $token; 
  12.         // var_dump(success_json_data(['token'=>$token])); 
  13.     } 
  14.    
  15.     public function check_login(){ 
  16.         $jwtAuth = JWTAuth::getInstance(); 
  17.         $jwtAuth->setToken('eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhcGkudGVzdC5jb20iLCJhdWQiOiJhcHAuY29tIiwiaWF0IjoxNTU2MDk1MDI5LCJleHAiOjE1NTYwOTUwNDksInVpZCI6MX0.oi4rLbQFNZUJsW4fVHWiOQxfEmomuvldAV-gFKl2V74'); 
  18.    
  19.         if($jwtAuth->validate() && $jwtAuth->verify()){ 
  20.             echo '验证成功'; 
  21.         }else{ 
  22.             echo '登录过期'; 
  23.         } 
  24.    
  25.     } 
  26. } 

最后

jwt本身的话是不带token刷新方法,所以一旦token过期,客户端就要重新登录。

Tags: JWT

分享到:

相关文章