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

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.     } 

最后

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

Tags: JWT

分享到:

相关文章