亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

php 后端實現JWT認證方法示例

2024-05-05 00:05:13
字體:
來源:轉載
供稿:網友

JWT是什么

JWT是json web token縮寫。它將用戶信息加密到token里,服務器不保存任何用戶信息。服務器通過使用保存的密鑰驗證token的正確性,只要正確即通過驗證。基于token的身份驗證可以替代傳統的cookie+session身份驗證方法。

它定義了一種用于簡潔,自包含的用于通信雙方之間以 JSON 對象的形式安全傳遞信息的方法。JWT 可以使用 HMAC 算法或者是 RSA 的公鑰密鑰對進行簽名。它具備兩個特點:

簡潔(Compact):可以通過URL, POST 參數或者在 HTTP header 發送,因為數據量小,傳輸速度快

自包含(Self-contained):負載中包含了所有用戶所需要的信息,避免了多次查詢數據庫

JWT由三個部分組成:header.payload.signature

以下示例以JWT官網為例

header部分:

{ "alg": "HS256", "typ": "JWT"}

對應base64UrlEncode編碼為:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

說明:該字段為json格式。alg字段指定了生成signature的算法,默認值為HS256,typ默認值為JWT

payload部分:

{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022}

對應base64UrlEncode編碼為:eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
說明:該字段為json格式,表明用戶身份的數據,可以自己自定義字段,很靈活。sub 面向的用戶,name 姓名 ,iat 簽發時間。例如可自定義示例如下:

{  "iss": "admin",     //該JWT的簽發者  "iat": 1535967430,    //簽發時間  "exp": 1535974630,    //過期時間  "nbf": 1535967430,     //該時間之前不接收處理該Token  "sub": "www.admin.com",  //面向的用戶  "jti": "9f10e796726e332cec401c569969e13e"  //該Token唯一標識}

signature部分:

HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), 123456) 

對應的簽名為:keH6T3x1z7mmhKL1T3r9sQdAxxdzB6siemGMr_6ZOwU

最終得到的JWT的json為(header.payload.signature):eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.keH6T3x1z7mmhKL1T3r9sQdAxxdzB6siemGMr_6ZOwU
說明:對header和payload進行base64UrlEncode編碼后進行拼接。通過key(這里是123456)進行HS256算法簽名。

JWT使用流程

  • 初次登錄:用戶初次登錄,輸入用戶名密碼
  • 密碼驗證:服務器從數據庫取出用戶名和密碼進行驗證
  • 生成JWT:服務器端驗證通過,根據從數據庫返回的信息,以及預設規則,生成JWT
  • 返還JWT:服務器的HTTP RESPONSE中將JWT返還
  • 帶JWT的請求:以后客戶端發起請求,HTTP REQUEST
  • HEADER中的Authorizatio字段都要有值,為JWT
  • 服務器驗證JWT

PHP如何實現JWT

作者使用的是PHP 7.0.31,不廢話,直接上代碼,新建jwt.php,復制粘貼如下:

<?php/** * PHP實現jwt */class Jwt {  //頭部  private static $header=array(    'alg'=>'HS256', //生成signature的算法    'typ'=>'JWT'  //類型  );  //使用HMAC生成信息摘要時所使用的密鑰  private static $key='123456';  /**   * 獲取jwt token   * @param array $payload jwt載荷  格式如下非必須   * [   * 'iss'=>'jwt_admin', //該JWT的簽發者   * 'iat'=>time(), //簽發時間   * 'exp'=>time()+7200, //過期時間   * 'nbf'=>time()+60, //該時間之前不接收處理該Token   * 'sub'=>'www.admin.com', //面向的用戶   * 'jti'=>md5(uniqid('JWT').time()) //該Token唯一標識   * ]   * @return bool|string   */  public static function getToken(array $payload)  {    if(is_array($payload))    {      $base64header=self::base64UrlEncode(json_encode(self::$header,JSON_UNESCAPED_UNICODE));      $base64payload=self::base64UrlEncode(json_encode($payload,JSON_UNESCAPED_UNICODE));      $token=$base64header.'.'.$base64payload.'.'.self::signature($base64header.'.'.$base64payload,self::$key,self::$header['alg']);      return $token;    }else{      return false;    }  }  /**   * 驗證token是否有效,默認驗證exp,nbf,iat時間   * @param string $Token 需要驗證的token   * @return bool|string   */  public static function verifyToken(string $Token)  {    $tokens = explode('.', $Token);    if (count($tokens) != 3)      return false;    list($base64header, $base64payload, $sign) = $tokens;    //獲取jwt算法    $base64decodeheader = json_decode(self::base64UrlDecode($base64header), JSON_OBJECT_AS_ARRAY);    if (empty($base64decodeheader['alg']))      return false;    //簽名驗證    if (self::signature($base64header . '.' . $base64payload, self::$key, $base64decodeheader['alg']) !== $sign)      return false;    $payload = json_decode(self::base64UrlDecode($base64payload), JSON_OBJECT_AS_ARRAY);    //簽發時間大于當前服務器時間驗證失敗    if (isset($payload['iat']) && $payload['iat'] > time())      return false;    //過期時間小宇當前服務器時間驗證失敗    if (isset($payload['exp']) && $payload['exp'] < time())      return false;    //該nbf時間之前不接收處理該Token    if (isset($payload['nbf']) && $payload['nbf'] > time())      return false;    return $payload;  }  /**   * base64UrlEncode  https://jwt.io/ 中base64UrlEncode編碼實現   * @param string $input 需要編碼的字符串   * @return string   */  private static function base64UrlEncode(string $input)  {    return str_replace('=', '', strtr(base64_encode($input), '+/', '-_'));  }  /**   * base64UrlEncode https://jwt.io/ 中base64UrlEncode解碼實現   * @param string $input 需要解碼的字符串   * @return bool|string   */  private static function base64UrlDecode(string $input)  {    $remainder = strlen($input) % 4;    if ($remainder) {      $addlen = 4 - $remainder;      $input .= str_repeat('=', $addlen);    }    return base64_decode(strtr($input, '-_', '+/'));  }  /**   * HMACSHA256簽名  https://jwt.io/ 中HMACSHA256簽名實現   * @param string $input 為base64UrlEncode(header).".".base64UrlEncode(payload)   * @param string $key   * @param string $alg  算法方式   * @return mixed   */  private static function signature(string $input, string $key, string $alg = 'HS256')  {    $alg_config=array(      'HS256'=>'sha256'    );    return self::base64UrlEncode(hash_hmac($alg_config[$alg], $input, $key,true));  }}  //測試和官網是否匹配begin  $payload=array('sub'=>'1234567890','name'=>'John Doe','iat'=>1516239022);  $jwt=new Jwt;  $token=$jwt->getToken($payload);  echo "<pre>";  echo $token;    //對token進行驗證簽名  $getPayload=$jwt->verifyToken($token);  echo "<br><br>";  var_dump($getPayload);  echo "<br><br>";  //測試和官網是否匹配end      //自己使用測試begin  $payload_test=array('iss'=>'admin','iat'=>time(),'exp'=>time()+7200,'nbf'=>time(),'sub'=>'www.admin.com','jti'=>md5(uniqid('JWT').time()));;  $token_test=Jwt::getToken($payload_test);  echo "<pre>";  echo $token_test;    //對token進行驗證簽名  $getPayload_test=Jwt::verifyToken($token_test);  echo "<br><br>";  var_dump($getPayload_test);  echo "<br><br>";  //自己使用時候end

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91青草视频久久| 中文字幕久久久av一区| 在线观看国产精品日韩av| 青青草原成人在线视频| 国产视频精品免费播放| 日韩成人久久久| 91视频-88av| 国产一区二区激情| 日韩毛片在线看| 伊人久久大香线蕉av一区二区| 日韩精品视频在线播放| 久久久成人的性感天堂| 欧美日韩午夜剧场| 国产91精品不卡视频| 亚洲成av人片在线观看香蕉| 高清欧美性猛交xxxx| 欧美激情国产精品| 日韩视频第一页| 丝袜亚洲另类欧美重口| 91视频88av| 国产精品男人的天堂| 国产亚洲一区二区精品| 538国产精品视频一区二区| 国产精品国产三级国产aⅴ浪潮| 久久影院资源站| 亚洲第一中文字幕在线观看| 久久久国产一区二区| 欧美午夜精品久久久久久久| 国产精品视频最多的网站| 中文字幕亚洲自拍| 伊人久久精品视频| 国产不卡在线观看| 久久久91精品国产一区不卡| 欧美成人免费视频| 欧美日韩日本国产| 欧美裸体xxxx极品少妇| 久久精品视频在线播放| 国产精品xxxxx| 国产精品视频久久久久| 久久精品99无色码中文字幕| 色播久久人人爽人人爽人人片视av| 欧美成年人网站| 成人做爽爽免费视频| 精品视频久久久久久久| 成人看片人aa| 国产香蕉97碰碰久久人人| 成人激情在线观看| 日韩欧亚中文在线| 大荫蒂欧美视频另类xxxx| 91免费精品国偷自产在线| 国产精品久久久久7777婷婷| 少妇激情综合网| 久久精品国产精品| 在线观看日韩欧美| 日本国产精品视频| 中文字幕亚洲情99在线| 国产999在线观看| 夜夜嗨av色综合久久久综合网| 欧美在线视频在线播放完整版免费观看| 欧洲精品毛片网站| 国产色婷婷国产综合在线理论片a| 中文字幕成人在线| 国产精品老女人精品视频| 81精品国产乱码久久久久久| 成人免费视频网址| 亚洲成人动漫在线播放| 亚洲天堂免费在线| 日韩成人在线免费观看| 国产精品v日韩精品| 亲爱的老师9免费观看全集电视剧| 国产精品1234| 国产伦精品一区二区三区精品视频| 色99之美女主播在线视频| 亚洲精品白浆高清久久久久久| 精品无码久久久久久国产| 国产丝袜一区二区三区免费视频| 国产97在线|亚洲| 日本久久亚洲电影| 国产一区二区精品丝袜| 日韩极品精品视频免费观看| 国产精品久久一区主播| 亚洲毛片在线观看| 性欧美视频videos6一9| 精品视频偷偷看在线观看| 中文字幕欧美日韩va免费视频| 色偷偷噜噜噜亚洲男人的天堂| 亚洲精品网址在线观看| 51精品在线观看| 黑人极品videos精品欧美裸| 日韩精品免费在线视频| 久久久91精品国产一区不卡| 中文字幕国产亚洲2019| 亚洲欧美国产va在线影院| 欧美日韩午夜剧场| 欧美剧在线观看| 欧美精品激情blacked18| 国产精品国产福利国产秒拍| 激情亚洲一区二区三区四区| 久久久精品美女| 亚洲精品白浆高清久久久久久| 欧美成人免费全部| 久久久综合免费视频| 国产91精品视频在线观看| 中文字幕精品在线视频| 欧美性受xxxx白人性爽| 亚洲欧洲一区二区三区久久| 欧美成人sm免费视频| 日韩免费高清在线观看| 欧美日韩精品在线播放| 成人性教育视频在线观看| 国产国语videosex另类| 久久精品亚洲国产| 国产精品久久久久久久天堂| 久久成人18免费网站| 精品福利在线观看| 亚洲欧美成人一区二区在线电影| 韩国三级电影久久久久久| 欧美日韩国产麻豆| 欧美日韩国产中文字幕| 国产欧美在线看| 最近的2019中文字幕免费一页| 国产黑人绿帽在线第一区| 久久99精品视频一区97| 92福利视频午夜1000合集在线观看| 成人免费激情视频| 日本精品va在线观看| 午夜剧场成人观在线视频免费观看| 国产精品毛片a∨一区二区三区|国| 丝袜一区二区三区| 国产精自产拍久久久久久| 亚洲最大福利视频网| 久久国产精品亚洲| 992tv成人免费影院| 日韩中文字幕国产| 国产精自产拍久久久久久| 欧美国产乱视频| 久久的精品视频| 久久九九有精品国产23| 亚洲日本中文字幕免费在线不卡| 成人激情电影一区二区| 久久久久久久国产精品| 人人爽久久涩噜噜噜网站| 孩xxxx性bbbb欧美| 成人欧美在线观看| 伊人久久久久久久久久久| 亚洲一区二区少妇| 中文字幕日韩视频| 川上优av一区二区线观看| 中文日韩在线视频| 亚洲精品99久久久久中文字幕| 98午夜经典影视| 韩国精品久久久999| 2019中文字幕全在线观看| 精品亚洲精品福利线在观看| 国产综合久久久久久| 亚洲欧美变态国产另类| 久久久久久91| 97视频在线播放| 久久精品国产电影| 亚洲一级免费视频| 日韩一区在线视频| 欧美日韩国产精品一区二区三区四区| 亚洲精品日韩激情在线电影| 亚洲午夜久久久影院|