QQ咨询 官方微信

添加微信好友

官方小程序

百度小程序

微信小程序

头条小程序

关于我们

PHP基础

php自定义token类并将生成的token放在http请求头的Authorization中的代码

 admin  2019-10-23 18:27:19
本篇文章给大家带来的内容是关于php自定义token类并将生成的token放在http请求头的Authorization中的代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

今天在使用laravel写东西的时候,需要与前端交互,看了jwt(json web token),于是自己想试着写一个简单的token类,token中存储了成员id和成员的权限,与前端交互时,将生成的token放在http请求头的Authorization中,整理如下:
  1. <?php 
  2.  
  3. namespace App\Http\Controllers\Auth; 
  4.  
  5. use Illuminate\Http\Request; 
  6.  
  7. use App\Http\Controllers\Controller; 
  8.  
  9. class TokenController extends Controller{ 
  10.  
  11.     /** 
  12.  
  13.      * header 
  14.  
  15.      * @var array 
  16.  
  17.      */ 
  18.  
  19.     private static $header = [         
  20.  
  21.     "type" => "token",         
  22.  
  23.     "alg"  => "HS256" 
  24.  
  25.     ];    /** 
  26.  
  27.      * create payload 
  28.  
  29.      * @param $memberId 
  30.  
  31.      * @param $permission 
  32.  
  33.      * @return array 
  34.  
  35.      */ 
  36.  
  37.     private static function payload($memberId, $permission) 
  38.  
  39.     { 
  40.  
  41.         return [             
  42.  
  43.         "iss"       => "http://api.creatshare.com",             
  44.  
  45.         "iat"       => $_SERVER['REQUEST_TIME'],            
  46.  
  47.          "exp"       => $_SERVER['REQUEST_TIME'] + 7200,             
  48.  
  49.          "GivenName" => "CreatShare",             
  50.  
  51.          "memberId"  => $memberId,             
  52.  
  53.          "permission"=> $permission 
  54.  
  55.         ]; 
  56.  
  57.     }    /** 
  58.  
  59.      * encode data 
  60.  
  61.      * @param $data 
  62.  
  63.      * @return string 
  64.  
  65.      */ 
  66.  
  67.     private static function encode($data) 
  68.  
  69.     { 
  70.  
  71.         return base64_encode(json_encode($data)); 
  72.  
  73.     }    /** 
  74.  
  75.      * generate a signature 
  76.  
  77.      * @param $header 
  78.  
  79.      * @param $payload 
  80.  
  81.      * @param string $secret 
  82.  
  83.      * @return string 
  84.  
  85.      */ 
  86.  
  87.     private static function signature($header, $payload, $secret = 'secret'
  88.  
  89.     { 
  90.  
  91.         return hash_hmac('sha256', $header.$payload, $secret); 
  92.  
  93.     }    /** 
  94.  
  95.      * generate a token 
  96.  
  97.      * @param $memberId 
  98.  
  99.      * @param $permission 
  100.  
  101.      * @return string 
  102.  
  103.      */ 
  104.  
  105.     public static function createToken($memberId, $permission) 
  106.  
  107.     { 
  108.  
  109.         $header = self::encode(self::$header);         
  110.  
  111.         $payload = self::encode(self::payload($memberId, $permission));         
  112.  
  113.         $signature = self::signature($header, $payload);         
  114.  
  115.         return $header . '.' .$payload . '.' . $signature; 
  116.  
  117.     }    /** 
  118.  
  119.      * check a token 
  120.  
  121.      * @param $jwt 
  122.  
  123.      * @param string $key 
  124.  
  125.      * @return array|string 
  126.  
  127.      */ 
  128.  
  129.     public static function checkToken($jwt, $key = 'secret'
  130.  
  131.     { 
  132.  
  133.         $token = explode('.', $jwt);         
  134.  
  135.         if (count($token) != 3)            
  136.  
  137.          return 'token invalid';         
  138.  
  139.          list($header64, $payload64, $sign) = $token;         
  140.  
  141.          if (self::signature($header64 , $payload64) !== $sign)             
  142.  
  143.          return 'token invalid';         
  144.  
  145.          $header = json_decode(base64_decode($header64), JSON_OBJECT_AS_ARRAY);         
  146.  
  147.          $payload = json_decode(base64_decode($payload64), JSON_OBJECT_AS_ARRAY);         
  148.  
  149.          if ($header['type'] != 'token' || $header['alg'] != 'HS256')             
  150.  
  151.          return 'token invalid';         
  152.  
  153.          if ($payload['iss'] != 'http://api.creatshare.com' || $payload['GivenName'] != 'CreatShare')             
  154.  
  155.          return 'token invalid';         
  156.  
  157.          if (isset($payload['exp']) && $payload['exp'] < time())             
  158.  
  159.          return 'timeout';         
  160.  
  161.          return [            
  162.  
  163.           'memberId' => $payload['memberId'],             
  164.  
  165.          'permission' =>$payload['permission'
  166.  
  167.         ]; 
  168.  
  169.     }    /** 
  170.  
  171.      * get a token 
  172.  
  173.      * @return null 
  174.  
  175.      */ 
  176.  
  177.     public static function getToken() 
  178.  
  179.     { 
  180.  
  181.         $token = null;         
  182.  
  183.         if (isset($_SERVER['HTTP_AUTHORIZATION']))             
  184.  
  185.         $token = $_SERVER['HTTP_AUTHORIZATION'];         
  186.  
  187.         return $token; 
  188.  
  189.     } 
  190.  

  1. $token = Token::createToken($member_id, $member_permission); //创建一个 
  2.  
  3. token$token = Token::getToken();    //从http请求头获取 
  4.  
  5. token$result = Token::checkToken(); //解析token 

【转载自php中文网:https://www.php.cn/php-weizijiaocheng-408399.html】

¥ 打赏
×
如果您觉得文章帮助了您就打赏一下吧
非常感谢你的打赏,我们将继续分享更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

本文《php自定义token类并将生成的token放在http请求头的Authorization中的代码》发布于石头博客文章,作者:admin,如若转载,请注明出处:https://www.pweb123.com/html/php/791.html,否则禁止转载,谢谢配合!

文章点评

我来说两句 已有0条评论
点击图片更换

添加微信好友

添加微信好友

微信小程序

百度小程序